簡體   English   中英

表達式樹listFoo.Where(lambda)拋出無效的參數錯誤

[英]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>結果,因此您仍然需要執行AsEnumerableToListToArray等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM