繁体   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