Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表达式树listFoo.Where(lambda)抛出无效参数错误_C#_Lambda - Fatal编程技术网

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
)。