2010-03-19 40 views
0

通過幾種方法實現了一個通用存儲庫。其中之一是這樣的:動態表達樹如何

public IEnumerable<T> Find(Expression<Func<T, bool>> where) 
     { 
      return _objectSet.Where(where); 
     } 

鑑於<T><Culture>很容易把這種像這樣:

Expression<Func<Culture, bool>> whereClause = c => c.CultureId > 4 ; 

return cultureRepository.Find(whereClause).AsQueryable(); 

但現在我看到(REALIZE),這種quering是「唯一的限制達到一個標準「。 我想要做的是這樣的:

在上面的例子中c是Culture的類型。文化有幾個屬性,如CultureId,Name,Displayname,... 我將如何表達以下內容: CultureId> 4和Name.contains('de')並在另一個執行 Name.contains('us')和Displayname .contains('ca')和...

這些查詢應該動態創建。 我看了一下表達式樹(因爲我認爲這是我的問題的解決方案 - 順便說一句,我從來沒有用過它們)但我找不到任何指向我的要求。

這是如何構造的?

在此先感謝

回答

0

Codeka給了我重新思考我的發言暗示,對此無限制一個參數。

原來我們很容易實現一個場景,全部我們要查詢的屬性,它們都有值。例如,如果Cutlure類型與3個屬性

定義

名稱字符串

DISPLAYNAME串

CultureId INT

多於一個可以實現一個過濾器表達式這樣

Expression<Func<Culture, bool>> whereClause = c => (
       (!String.IsNullOrEmpty(FilterCulture.Name) ? c.Name.Contains(FilterCulture.Name) : true) && 
       (!String.IsNullOrEmpty(FilterCulture.Displayname) ? c.Displayname.Contains(FilterCulture.Displayname) : true) && 
       (FilterCulture.CultureId > 0 ? c.CultureId == FilterCulture.CultureId : true) 
       ); 

正如你可以看到我使用每個屬性之間的運算符來縮小結果(可以使用||以擴大結果 - 從而實施OR)。

再次感謝您的codeka!

0

你不需要做什麼特別的事情,下面的工作:

var whereClause = c => (c.CultureId > 4 && c.Name.Contains("de")); 
+0

我想我在我的第一篇文章中不是很清楚。看看我提出的解決方案。 – 2010-03-24 10:44:12