Vac*_*ano 6 c# linq linq-to-objects linq-to-sql
我有以下链接功能
MyLinqToSQLTable.Where(x => x.objectID == paramObjectID).ToList();
Run Code Online (Sandbox Code Playgroud)
我大部分时间都可以通过在方法体周围添加花括号来将linq调用更改为多行.像这样:
MyLinqToSQLTable.Where(x =>
{
x.objectID == paramObjectID;
}).ToList();
Run Code Online (Sandbox Code Playgroud)
问题是当我刚刚进行布尔比较时存在的隐含返回现在没有完成.返回(x.objectID == paramObjectID); 也不被接受.
怎么办?我可以这样做吗?
注意:我知道如果需要我可以添加另一个where子句.但我仍然想知道答案.
您的第一个查询与此相同:
MyLinqToSQLTable.Where(x =>
{
return x.objectID == paramObjectID;
}).ToList();
Run Code Online (Sandbox Code Playgroud)
您在return这里缺少关键字.当lambda主体是显式块而不是表达式时,这是必要的.
规范正式定义了语法中的lambda表达式,如:
lambda-expression:
anonymous-function-signature => anonymous-function-bodyanonymous-function-body:
表达式
块
前一种情况(表达式)适用于身体不以左大括号开头的情况.后一种情况(块)被定义为一系列语句(就像方法体一样).与C#中的其他位置一样,块中的表达式语句仅限于声明,赋值,函数调用,递增和递减.仅将运算符==应用于一对标识符并不表达有效语句.第二个问题是,当方法的返回类型(匿名或非匿名)不是时void,到达块末尾的所有代码路径都应返回一个值.因此,即使lambda的主体在语法上是有效的,没有return语句,你的lambda也可以转换为Action<T>,而不是Func<T, bool>该Where方法所期望的.
问题是当我刚刚进行布尔比较时存在的隐含返回现在没有完成.返回(x.objectID == paramObjectID); 也不被接受.
当然,x => { return x.objectID == paramObjectID; }lambda表达式的变体只有在它应该被转换为匿名方法而不是表达式树时才有可能.也就是说,具有块体的lambda 不可转换为Expression<T>.这就是为什么你可以在LINQ用它来对象(其中Where需要Func<T, bool>),但你不能在LINQ用它来SQL(其中Where需要Expression<Func<T, bool>>).
| 归档时间: |
|
| 查看次数: |
1981 次 |
| 最近记录: |