从linq where return返回

时间:2010-03-11 20:55:54

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

我有以下链接功能

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

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

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

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

怎么做?我可以这样做吗?

注意:我知道如果需要我可以添加另一个where子句。但我仍然想知道答案。

3 个答案:

答案 0 :(得分:8)

您的第一个查询与此相同:

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

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

规范在语法中正式定义 lambda-expression ,如:

  

λ-表达
   anonymous-function-signature => 匿名功能体

     

匿名功能体
  表达
  

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


更新

  

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

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

答案 1 :(得分:1)

这有用吗?

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

答案 2 :(得分:-1)

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