C# 表达式树listFoo.Where(lambda)抛出无效参数错误
为什么下面的代码抛出“。。。在“”处有一些无效参数C# 表达式树listFoo.Where(lambda)抛出无效参数错误,c#,lambda,C#,Lambda,为什么下面的代码抛出“。。。在“”处有一些无效参数 var qry = listFoo.Where(lambda); 我应该如何编写listFoo,以便通过传递谓词委托调用其中的Where。我的全部代码如下所示 List<Foo> listFoo = new List<Foo>(); ParameterExpression foo = Expression.Parameter(typeof(Foo), "foo"); MemberExp
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);
List listFoo=new List();
ParameterExpression foo=表达式参数(typeof(foo),“foo”);
MemberExpression bar=Expression.PropertyOrField(foo,“bar”);
ConstantExpression abc=表达式.常量(“abc”,typeof(string));
二进制表达式测试=表达式.Equal(条形,abc);
表达式lambda=Expression.lambda(test,foo);
var qry=listFoo.Where(λ);
因为您的列表不可用。你为什么不这样做呢
var qry = listFoo.Where(foo => foo.Bar == "abc");
如果您无法做到这一点,请执行以下操作:
var qry = listFoo.Where(lambda.Compile()); //warning, slow performance
因为您的列表不可更改。你为什么不这样做呢
var qry = listFoo.Where(foo => foo.Bar == "abc");
如果您无法做到这一点,请执行以下操作:
var qry = listFoo.Where(lambda.Compile()); //warning, slow performance
IEnumerable上的LINQ扩展方法采用委托实例(要么
Action
要么Func
对象)。lambda只是委托文本,因此在本例中,它不会采用表达式
,因为您给它的是一个计划,而不是委托。这就是一个表达式,是一个如何处理一些数据的计划。IQueryable接受表达式(编译器将委托文本视为Expression
s),这样它就可以接受计划并合并(如果可以减少的话)
对于IEnumerable,在将其传递给Where
方法之前,必须在表达式上调用Compile()
。但是,您可以这样做:
var qry = listFoo.AsQueryable().Where(lambda);
但是,这将给您一个IQueryable
结果,因此您仍然需要执行AsEnumerable
、ToList
、ToArray
,等等。IEnumerable上的LINQ扩展方法获取委托实例(无论是Action
还是Func
对象)。lambda只是委托文本,因此在本例中,它不会采用表达式
,因为您给它的是一个计划,而不是委托。这就是一个表达式,是一个如何处理一些数据的计划。IQueryable接受表达式(编译器将委托文本视为Expression
s),这样它就可以接受计划并合并(如果可以减少的话)
对于IEnumerable,在将其传递给Where
方法之前,必须在表达式上调用Compile()
。但是,您可以这样做:
var qry = listFoo.AsQueryable().Where(lambda);
但是,这将给您一个IQueryable
结果,因此您仍然需要在内部执行AsEnumerable
、ToList
、ToArray
等操作。(或.AsQueryable()。其中(lambda)
)执行相同的操作。它只是掩盖了它。@usr:实际上,柯克的建议是不同的,因为它允许从查询表中对表达式进行下游分析。(或.AsQueryable()。(lambda)
)在内部,这做同样的事情。它只是掩盖了它。@usr:实际上,柯克的建议不同,它允许从查询表中对表达式进行下游分析。不理解“IQueryable接受表达式(并将委托文本强制转换为表达式)”的意思IQueryable
LINQ扩展方法将Expression
或Expression
作为参数,但是您仍然可以传递委托文本(lambda,即ti=>ti>5
),并将其视为表达式(编译器将)。事实上,如果您试图声明一个隐式类型的lambda(var lam=(ti)=>ti+5;
),您将看到编译器会抱怨,因为它不知道如何将其视为(Expression
或Func/Action
)表达式。不理解“IQueryable”的含义(并将委托文本强制转换为表达式)“IQueryable
LINQ扩展方法将Expression
或Expression
作为参数,但是您仍然可以传递委托文本(lambda,即ti=>ti>5
),并将其视为表达式(编译器将).事实上,如果您试图声明隐式类型的lambda(var lam=(ti)=>ti+5;
),您会看到编译器会抱怨,因为它不知道该将其视为什么(Expression
或Func/Action
)。