我想使用Linq to Objects查询根据相当复杂的选择标准从列表中选择某些成员(为简化此处表示为return true
: - )
使用Where扩展方法,这很好用:
var matches = (from wm in Members
select wm).Where(p =>
{
return true;
});
但是,当我尝试使用查询语法执行相同的操作时:
var matches2 = (from wm in Members
where (p =>
{
return true;
})
select wm);
编译器对象
无法将lambda表达式转换为'bool'类型,因为它不是 委托类型
幕后发生了什么,如何在查询语法中使用lamda表达式?
答案 0 :(得分:3)
您的查询会被翻译为:
Members.Where(member=> p=>{return true;});
...没有编译因为(警告:技术错误可能在这里)Where()
需要类型为Func<TSource, bool>
的参数。您正在为其提供一个可转换为Func<TSource, Func<???, bool>>
类型的参数。该错误告诉您lambda表达式无法转换为bool,因为lambda表达式只能转换为委托类型(例如Func<...>
,而bool不是委托类型。(/ end bumbling explanation)
在查询语法中,您在where
子句中放置的任何内容都位于生成的=>
方法调用的lambda表达式中的Where()
之后。请注意,您的第一个代码段可以重写为:
Members.Where(p=>true);
相当于:
from m in members
where true
select m;
如果你真的需要一个带有语句块的lambda,你可以这样做:
var lam = (Member m)=> {return true;};
from m in members
where lam(m)
select m;
或内联它:
from m in members
where ((Func<Member, bool>)(Member m)=> {return true;})(m)
select m;
或者您可以使用常规方法而不是匿名方法:
public bool DoStuff(int i)
{
return true;
}
...
from m in members
where DoStuff(m)
select m;