c# - 从 linq where 语句返回

标签 c# linq linq-to-sql linq-to-objects

我有以下链接功能

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-body

anonymous-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/

相关文章:

c# - Code First - 自引用一对多关系

c# - "The LINQ expression node type ' 调用 ' is not supported in LINQ to Entities"- 难倒了!

sql - 是否可以在不拖放的情况下使用 Linq-SQL?

从 MVC Razor 中的数据库获取数据时的 LINQ 查询性能问题

c# - 使用 linq-to-sql 插入对象列表

c# - Convert.ToDouble ("1.3") 返回 13

c# - 在 C# datagridview 中隐藏某些列标题

c# - 如何通过 .NET 在 MongoDB 中创建索引

c# - 使用多个 Contains 需要时间来加载 Linq 中的性能问题

c# - DELETE 语句与 REFERENCE 约束冲突