[英]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.