2011-08-12 47 views
0

我在那個用戶中有一個接口,指示它們之間的一些元素和運算符,我應該顯示結果。在.NET中構建一個簡單的表達式

用戶可以建立然後像p1 OP v1 OR p2 OP v2一個過濾器,其中p1p2Person屬性,如Age, Name, Locationv1v2是比較值(10, '瑪利亞', 'LA'),OP是比較操作符(=,< ,>)和OR是一個邏輯運算符(也可以是AND)。

如:
Age > 18 AND Location = 'Paris',或另一個類似
Name Contains 'andro' AND Sex = 'm'

myPeople收集與該過濾字符串,如何建立和應用使用Linq.Expressions這體現在哪裏?

我試圖用DynamicLinq,但實際上我用「去哪兒」上List<Person>有問題,顯然不是IQueryable ...

回答

1

如果你想用List<T>使用它,我不會理會使用表達式樹入手:

public static Func<T, bool> Or<T>(Func<T, bool> predicate1, 
            Func<T, bool> predicate2) 
{ 
    return t => predicate1(t) || predicate2(t); 
} 

public static Func<T, bool> And<T>(Func<T, bool> predicate1, 
            Func<T, bool> predicate2) 
{ 
    return t => predicate1(t) && predicate2(t); 
} 

然後,你可以這樣做:

Func<Person, bool> isAdult = person => person.Age > 18; 
Func<Person, bool> isInParis = person => person.Location == "Paris"; 

var personInParis = And(isAdult, isInParis); 

對於equiva如果你想要那些表達樹,請看PredicateBuilder

棘手的一點可能是將您的字符串轉換爲表達式樹開始。

如果動態LINQ做的一切你想別的,你可以使用AsQueryable從一個IEnumerable<T>創建IQueryable<T>

+0

問題是在真實項目中謂詞的數目是未知的 - 用戶可以添加過濾器的數量是多少。那麼,我最終應該如何處理這個'var adultPersonInParis',將它應用於Where子句中呢? – serhio

+0

@serhio:只要繼續構建一個謂詞 - 從始終*返回true的東西開始,並適當地應用AND和OR。查看PredicateBuilder鏈接瞭解更多細節 - 以上是相同的想法,僅適用於代表而不是表達式樹。 –