2011-10-15 89 views
1

我想將lambda函數的多重選擇合併到lambda表達式中。我怎麼做?我知道最後一行是錯誤的,但是讓你明白我的意思。將Lambda函數轉換爲Lambda表達式

Func<Event, bool> where = null; 

if (!string.IsNullOrWhiteSpace(searchToken)) 
    where = q => q.Name.ToUpper().Contains(searchToken.ToUpper()); 

where += q => q.Hidden = false; 

Expression<Func<Event, bool>> where1 = q => where; <-- Erroring 
+1

目前尚不清楚你的目標是什麼。你是否想要執行多個過濾器?什麼是更大的圖片? –

+0

更大的圖片是我有一個通用函數,需要表達式>。我有條件聲明,我需要添加或不。我正在使用Func 來構建我的標準,但希望將它作爲表達式>發送到泛型函數。 –

+0

我注意到了一種叫做表達式生成器的東西,但是有沒有一種默認的方式來做到這一點? –

回答

4

我懷疑你想要PredicateBuilder。 (源是可用的頁面上。)你會使用這樣的:

var predicate = q => !q.Hidden; 
if (!string.IsNullOrWhiteSpace(searchToken)) 
{ 
    predicate = predicate.And(q => q.Name.ToUpper() 
             .Contains(searchToken.ToUpper()); 
} 
return predicate; 

這是假設你想「和」的條件 - 你從來沒有說的很清楚......

注意那就是而不是這是一種以不區分大小寫的方式進行比較的好方法。如果您可以告訴我們將使用哪些查詢(例如LINQ to SQL,LINQ to EF),我們可以建議執行不區分大小寫的查詢的供應商兼容方式。

+0

什麼是var predicate = q =>!q.Hidden;?這是Func的表達嗎? –

+0

@MikeFlynn:那不會編譯 - 你不能使用將lambda表達式分配給隱式類型變量。你可以有'Expression > predicate = q =>!q.Hidden;'或'Func predicate = q =>!q.Hidden;'。第一個會給你一個表達樹,後者是一個代表。 –

0

看看http://msdn.microsoft.com/en-us/library/bb882637.aspx。如何使用表達式樹來構建動態查詢。當使用表達式<>就像在表達式必須在編譯時已知的一樣,因爲編譯器然後編譯AST抽象語法三並將它作爲數據存儲在您的表達式<>實例中。