我有以下链接功能
MyLinqToSQLTable.Where(x => x.objectID == paramObjectID).ToList();
在大多数情况下,您可以通过在方法主体周围添加大括号来将 linq 调用更改为多行。像这样:
MyLinqToSQLTable.Where(x =>
{
x.objectID == paramObjectID;
}).ToList();
问题是我刚刚进行 bool 比较时存在的隐含返回现在没有完成。返回 (x.objectID == paramObjectID);也不接受。
如何做到这一点?我可以这样做吗?
注意:我知道如果需要我可以添加另一个 where 子句。但我还是想知道这个问题的答案。
最佳答案
你的第一个查询等同于这个:
MyLinqToSQLTable.Where(x =>
{
return x.objectID == paramObjectID;
}).ToList();
您缺少 return
关键字在这里。当 lambda 主体是显式 block 而不是表达式时,这是必要的。
规范正式定义了 lambda-expression 语法如下:
lambda-expression:
anonymous-function-signature => anonymous-function-bodyanonymous-function-body:
expression
block
前一种情况(表达式)适用于正文不以左花括号开头的情况。后一种情况 (block) 被定义为一系列语句(就像方法体一样)。与 C# 中的其他地方一样, block 中的表达式语句仅限于声明、赋值、函数调用、递增和递减。仅应用运算符 ==
对于几个标识符,表达式不是有效的语句。第二个问题是,当方法(匿名或非匿名)的返回类型不是 void
时,所有到达 block 末尾的代码路径都应返回一个值。因此,即使您的 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 表达式的变体仅当它应该被转换为匿名方法而不是表达式树时才有可能。也就是说,具有 block 主体的 lambda 不能转换为 Expression<T>
。 .这就是为什么您可以在 LINQ to Objects 中使用它(其中 Where
采用 Func<T, bool>
)但不能在 LINQ to SQL 中使用它(其中 Where
采用 Expression<Func<T, bool>>
)。
关于c# - 从 linq where 语句返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428598/