2011-09-04 28 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;