【问题标题】:return from a linq where statement从 linq where 语句返回
【发布时间】:2010-03-11 20:55:54
【问题描述】:

我有如下链接功能

MyLinqToSQLTable.Where(x => x.objectID == paramObjectID).ToList();

我大多数时候可以通过在方法主体周围添加花括号来将 linq 调用更改为多行。像这样:

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

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

如何做到这一点?我可以这样做吗?

注意:我知道如果需要我可以添加另一个 where 子句。但我还是想知道这个问题的答案。

【问题讨论】:

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


    【解决方案1】:

    你的第一个查询相当于这个:

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

    您在此处缺少return 关键字。当 lambda 主体是显式块而不是表达式时,这是必需的。

    规范正式定义了 lambda-expression,语法如下:

    lambda 表达式
    匿名函数签名 => 匿名函数体

    匿名函数体
    表达式
    阻止

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


    更新:

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

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

    【讨论】:

    • +1 指出不能在 LINQ to SQL 或 EF 中使用多行 lambda,因为它不能转换为表达式树。
    【解决方案2】:

    这行得通吗?

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

    【讨论】:

      【解决方案3】:
      MyLinqToSQLTable.Where(x =>  
      {   
          return x.objectID == paramObjectID;  
      }).ToList();  
      or
      MyLinqToSQLTable.Where(x =>  
      {   
          return x.objectID == paramObjectID;  
      }).ToArray();
      

      【讨论】:

      • 已经有两个其他答案说了同样的话。这个答案没有任何价值。
      猜你喜欢
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多