0

为什么下面的代码会抛出 '... has some invalid arguments at'

    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);
4

2 回答 2

3

因为您的列表不是 IQueryable。你为什么不这样做呢?

var qry = listFoo.Where(foo => foo.Bar == "abc");

如果您不能这样做,请执行以下操作:

var qry = listFoo.Where(lambda.Compile()); //warning, slow performance
于 2012-05-30T13:36:26.957 回答
0

IEnumerable 上的 LINQ 扩展方法采用委托实例(Action<>Func<>对象)。Lambdas 只是委托文字,所以在这种情况下它不需要 anExpression<Func<>>因为你给它一个计划,而不是一个委托。这就是一个表达式,是一个如何处理一些数据的计划。IQueryable 采用 Expressions(并且编译器将委托文字视为Expressions),以便它可以采用计划并整合(如果可以减少它们)。

对于 IEnumerable,您必须Compile()Expression<Func<>>将其传递给Where方法之前调用它。但是,您可以这样做:

var qry = listFoo.AsQueryable().Where(lambda);

但是,这会给你一个IQueryable<Foo>结果,所以你仍然需要做AsEnumerable, ToList,ToArray等。

于 2012-05-30T13:41:00.090 回答