2009-05-18 34 views
15

我試圖使用PredicateBuilder,這裏描述 - http://www.albahari.com/nutshell/predicatebuilder.aspxLINQ的PredicateBuilder - 多手術室

下面的代碼

var predicate = PredicateBuilder.False<StreetDTO>(); 

     predicate = predicate.Or(p => p.Locality.Contains(criteria.Locality)); 
     predicate = predicate.Or(p => p.Name.Contains(criteria.Name)); 
     predicate = predicate.Or(p => p.Town.Contains(criteria.Town)); 

     List<StreetDTO> streetData = StreetData.Instance(); 

     var streetList = from street in streetData.Where(predicate) 
         select street; 

據我看到這個應該工作,根據例如

var newKids = Product.ContainsInDescription ("BlackBerry", "iPhone"); 

var classics = Product.ContainsInDescription ("Nokia", "Ericsson") 
         .And (Product.IsSelling()); 
var query = 
    from p in Data.Products.Where (newKids.Or (classics)) 
    select p; 

,但我得到的是

錯誤1爲方法 'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable, System.Func)' 的類型參數不能 從使用推斷。嘗試 顯式指定類型參數 。

我想在LINQ'在職'中獲得一些理解,所以如果這是一個簡單的問題,請道歉。

+0

感謝讓我知道PredicateBuilder! – Romias 2012-05-01 17:25:49

回答

18

啊;您的列表使用IEnumerable<T>擴展方法(而不是IQueryable<T>) - 嘗試:

var streetList = from street in streetData.AsQueryable().Where(predicate) 
       select street; 
11

嘗試編譯你的斷言:

var streetList = from street in streetData.Where(predicate.Compile()) 
       select street; 
+0

謝謝,這也起到了作用,儘管我將Marc標記爲答案,因爲我找到了與其他地方相匹配的另一個答案。我不確定哪種方式是首選? – Duncan 2009-05-18 10:36:19

+0

@Duncan,我不確定女巫是否是首選的方式:(這與linq如何在內部實現它的魔法*我不相信你會在性能方面遇到任何重大問題,如果你 – 2009-05-18 11:07:26