2011-09-04 31 views
0

我想使用LINQ到对象查询到基于相当复杂的选择标准从列表中选择某些成员(在这里表示为return true :-)LINQ查询语法和复杂有条件的地方

简化使用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); 

的COM堆垛机对象

无法转换lambda表达式“BOOL”类型,因为它不是 委托类型

这是怎么回事幕后,我怎么可以使用LAMDA表达与查询语法?

回答

3

查询被转换成类似:

Members.Where(member=> p=>{return true;}); 

...不编译,因为(警告:技术失误可能是这里)Where()预计Func<TSource, bool>类型的参数。你给它一个参数,将被转换为Func<TSource, Func<???, bool>>类型。错误是告诉你一个lambda表达式不能转换为bool,因为lambda表达式只能转换为委托类型(例如Func<...>,而bool不是委托类型。)(/ bumbling说明)

查询语法,无论你把你的where子句中所生成的Where()方法调用lambda表达式的=>后去注意你的第一个片段可以被改写为:

Members.Where(p=>true); 

这相当于:

from m in members 
where true 
select m; 

如果你真的需要一个拉姆达与它语句块,你可以这样做:

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;