我有以下链接功能
MyLinqToSQLTable.Where(x => x.objectID == paramObjectID).ToList();
我大部分时间都可以通过在方法体周围添加花括号来将linq调用更改为多行。像这样:
MyLinqToSQLTable.Where(x =>
{
x.objectID == paramObjectID;
}).ToList();
问题是当我刚刚进行布尔比较时,隐含的返回就是现在没有完成。返回(x.objectID == paramObjectID);也不被接受。
怎么做?我可以这样做吗?
注意:我知道如果需要我可以添加另一个where子句。但我仍然想知道答案。
答案 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();