C# · 12月 23, 2021

c# – 从linq where语句返回

我有以下链接功能 MyLinqTosqlTable.Where(x => x.objectID == paramObjectID).ToList();

我大部分时间都可以通过在方法体周围添加花括号来将linq调用更改为多行.像这样:

MyLinqTosqlTable.Where(x =>{ x.objectID == paramObjectID;}).ToList();

问题是当我刚刚进行布尔比较时存在的隐含返回现在没有完成.返回(x.objectID == paramObjectID);也不被接受.

怎么办?我可以这样做吗?

注意:我知道如果需要我可以添加另一个where子句.但我仍然想知道答案.

解决方法 您的第一个查询与此相同: MyLinqTosqlTable.Where(x =>{ return x.objectID == paramObjectID;}).ToList();

你在这里缺少return关键字.当lambda主体是显式块而不是表达式时,这是必要的.

规范正式定义了语法中的lambda表达式,如:

lambda-expression:
anonymous-function-signature => anonymous-function-body

anonymous-function-body:
expression
block

前一种情况(表达式)适用于身体不以左大括号开头的情况.后一种情况(块)被定义为一系列语句(就像方法体一样).与C#中的其他位置一样,块中的表达式语句仅限于声明,赋值,函数调用,递增和递减.仅将operator ==应用于一对标识符并不表达有效语句.第二个问题是,当方法的返回类型(匿名或非匿名)不为void时,到达块末尾的所有代码路径都应返回一个值.因此,即使你的lambda的主体在语法上是有效的,没有return语句,你的lambda也可以转换为Action< T>,而不是Func< T,bool> Where方法所期望的.

更新:

Problem is the implied return that was there when I just did a Boolean compare is Now not done. Return (x.objectID == paramObjectID); is not accepted either.

当然,x => {return x.objectID == paramObjectID;只有当它应该转换为匿名方法而不是表达式树时,才能实现lambda表达式的变体.也就是说,具有块体的λ不能转换为表达式< T>.这就是为什么你可以在LINQ to Objects中使用它(其中Where采用Func< T,bool>)但你不能在LINQ to sql中使用它(其中Where需要Expression< Func< T,bool>>).