![](/img/trans.png)
[英]Getting an error with .Where using a lambda expression in a foreach loop for invalid arguments
[英]Expression tree, listFoo.Where(lambda) throws invalid argument error
为什么下面的代码抛出“ ...在某些无效参数处”
var qry = listFoo.Where(lambda);
我应该如何编写我的listFoo以便通过传递谓词委托在其上调用Where。 我的整个代码如下
List<Foo> listFoo = new List<Foo>();
ParameterExpression foo = Expression.Parameter(typeof(Foo), "foo");
MemberExpression bar = Expression.PropertyOrField(foo, "Bar");
ConstantExpression abc = Expression.Constant("abc", typeof(string));
BinaryExpression test = Expression.Equal(bar, abc);
Expression<Func<Foo, bool>> lambda = Expression.Lambda<Func<Foo, bool>>(test, foo);
var qry = listFoo.Where(lambda);
因为您的列表不可查询。 你为什么不这样做呢?
var qry = listFoo.Where(foo => foo.Bar == "abc");
如果您不能这样做,请执行以下操作:
var qry = listFoo.Where(lambda.Compile()); //warning, slow performance
IEnumerable上的LINQ扩展方法采用委托实例( Action<>
或Func<>
对象)。 Lambda只是委托文字,因此在这种情况下,它不会使用Expression<Func<>>
因为您要给它一个PLAN,而不是委托。 这就是表达式,这是有关如何处理某些数据的计划。 IQueryable采用表达式(并且编译器将委托文字视为Expression
),以便它可以采用计划并进行合并(如果可以简化的话)。
对于IEnumerable,必须将Expression<Func<>>
调用Compile()
,然后再将其传递给Where
方法。 但是,您可以这样做:
var qry = listFoo.AsQueryable().Where(lambda);
但是,这将为您提供IQueryable<Foo>
结果,因此您仍然需要执行AsEnumerable
, ToList
, ToArray
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.