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-bodyanonymous-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>>).