表达式树中的简单Where子句
我正在尝试构建一个简单的Where 子句。
这是不起作用的代码:
编辑此代码现在可以正常工作(感谢下面的答案)。
public class Item
{
public int Value { get; set; }
public string Name { get; set; }
}
var _List = new List<Item>
{
new Item{ Name = "Smith", Value = 1},
new Item{ Name = "Smith", Value = 2},
new Item{ Name = "Wesson", Value = 3},
new Item{ Name = "Wesson", Value = 4},
};
// Where(x => x.Value == 1)
var _Type = typeof(Item);
var _Prop = _Type.GetProperty("Value");
var _Param = Expression.Parameter(_Type, _Prop.Name);
var _Left = Expression.PropertyOrField(_Param, _Prop.Name);
var _Right = Expression.Constant(1, _Prop.PropertyType);
var _Body = Expression.Equal(_Left, _Right);
var _Where = Expression.Lambda<Func<Item, bool>>(_Body, _Param);
var _Result = _List.AsQueryable().Where(_Where);
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的代码存在几个问题:
对于整数常量
1
,您需要传递1
而不是"1"
。Expression.Equals 如果两个表达式树相等。它返回一个
bool
。Expression.Equal 返回表示相等性检查的表达式树。
参数的类型为
Item
,而不是int
。列表实现 IEnumerable,但不实现 IQueryable。
IEnumerable;与委托一起工作,而 IQueryable适用于表达式树。
因此您需要将表达式树编译为委托
或将列表转换为 IQueryable。
工作代码:
There are several problems with your code:
You need to pass
1
and not"1"
for the integer constant1
.Expression.Equals if two expression trees are equal. It returns a
bool
.Expression.Equal returns an expression tree that represents an equality check.
The parameter is of type
Item
and notint
.The List<T> implements IEnumerable<T>, but not IQueryable<T>.
IEnumerable<T> works with delegates, while IQueryable<T> works with expression trees.
So you need to either compile your expression tree to a delegate
or convert the list to IQueryable<T>.
Working code: