获取表达式树中方法的表达式
我想在表达式树中创建以下查询:
var test = from datarow in tempResults
where datarow.Field<String>("ColumnName") == "Column"
select datarow;
如何创建表达式:
datarow.Field<String>("ColumnName")?
我尝试了一切,甚至在获取 Expression.Call 方法的 Field 的 MethodInfo 时陷入困境。 Field 是 DataRowExtentions 的扩展方法。
我必须为此使用 Expression.Call() 吗? 我如何获取方法信息? 有更简单的方法吗?
我试过 :
ParameterExpression dataRow = Expression.Parameter(typeof(DataRowExtensions), "dataRow"); 表达式 left = Expression.Call(dataRow, typeof(DataRowExtensions).GetMethod("Field"));
但它不起作用。
我想对 IQueryable tempResults 内的数据创建动态过滤器。
用户将选中 GUI 上的复选框,将“Where”表达式添加到 tempResults 中的数据。当用户选择“Column”时,我想显示 ColumnName =“Column”的 DataRows。
这就是为什么我需要创建 where 表达式。但我对 MethodInfo 的事情很困惑。我也尝试过这个:
MethodInfo FieldStringMethodInfo = typeof(DataRowExtensions).GetMethod("Field", BindingFlags.Public | BindingFlags.Static);
但它也不起作用。
还有其他方法吗?
i want to create the following query in expression trees:
var test = from datarow in tempResults
where datarow.Field<String>("ColumnName") == "Column"
select datarow;
How do i create the expression:
datarow.Field<String>("ColumnName")?
i tried everything, i even got stuck on getting the MethodInfo of Field for the Expression.Call method.
Field is an extention Method of DataRowExtentions.
Do i have to use Expression.Call() for this?
How do i get the MethodInfo?
is there a simplier way to do it ?
i tried :
ParameterExpression dataRow = Expression.Parameter(typeof(DataRowExtensions), "dataRow");
Expression left = Expression.Call(dataRow, typeof(DataRowExtensions).GetMethod("Field"));
but it doesn't work.
i want to create dynamic filters on the data inside IQueryable tempResults.
The user will check on checkboxes on the GUI that will add 'Where' expressions to the data in tempResults. when the user chooses "Column" i want to present the DataRows where ColumnName = "Column".
that is why i need to create the where expression. but i'm so stuck on the MethodInfo thing. I tried this too:
MethodInfo FieldStringMethodInfo = typeof(DataRowExtensions).GetMethod("Field", BindingFlags.Public | BindingFlags.Static);
but it doesn't work too.
Is there other ways to do it ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
注释中澄清后的替换答案:
对于连续构建附加过滤器,您不需要表达式树;您可以多次调用
.Where
(根据需要,每个搜索词一次) - 例如:唯一需要注意的是“捕获”问题;确保不要重复使用任何
value1
、value2
等 - 否则最后一个值将应用于早期过滤器...委托组合的示例(来自评论) - 请注意,我在这里删除了
DataTable
方面,纯粹是为了使示例更短(它将以相同的方式工作):(原始答案)
实际上,LINQ 的变体赢了不使用表达式树...它将使用委托;但如果你真的想要的话,你可以构建树并编译它......不过,我不确定为什么你会这样做。你想让我做什么?我会举一个例子......
给你;这使用了表达式树,但除了证明你可以之外,我想不出这样做的任何充分理由!
Replacement answer following clarification in comments:
For successively building additional filters, you don't need expression trees; you can call
.Where
multiple times (as necessary, once per search term) - for example:The only thing to watch is the "capture" issue; be sure not to re-use any of the
value1
,value2
etc - otherwise the last value will apply to earlier filters...For an example of delegate combination (from comments) - note that I've dropped the
DataTable
aspect here purely to make the example shorter (it will work identically):(original answer)
Actually, that variant of LINQ won't use an expression tree... it will use a delegate; but you can build the tree and compile it if you really want... I'm not sure why you would, though. What do you want to do? I'll knock up an example...
Here you go; this uses an expression tree, but I can't think of a single good reason to do this, other than to prove that you can!