2009-05-18 21 views
15

Tôi đang cố gắng sử dụng PredicateBuilder, như mô tả ở đây - http://www.albahari.com/nutshell/predicatebuilder.aspxLINQ PredicateBuilder - Nhiều ORS

Các mã sau

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; 

như xa như tôi thấy công việc nên này, theo Ví dụ

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; 

nhưng tất cả tôi nhận được là

Lỗi 1 Đối số kiểu cho phương thức 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' không thể là được suy ra từ mức sử dụng. Hãy thử chỉ định các đối số loại một cách rõ ràng.

Tôi đang cố gắng tìm hiểu về LINQ 'on-the-job', vì vậy xin lỗi nếu đây là một câu hỏi đơn giản.

+0

cảm ơn vì cho tôi biết về PredicateBuilder !! – Romias

Trả lời

18

Ah; danh sách của bạn đang sử dụng IEnumerable<T> phương pháp khuyến nông (chứ không phải IQueryable<T>) - thử:

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

Đó là một - cảm ơn! Tôi sẽ cần để có được cho mình một cuốn sách Linq phong nha, tôi không nghĩ rằng đó là một cái gì đó bạn có thể tìm hiểu trên hoof ... – Duncan

+2

LINQ trong hành động, hoặc các chương sau của C# trong chiều sâu là khá tốt. –

+0

Cảm ơn Marc cho các chỉ dẫn về LINQ trong hành động. =) –

11

Cố gắng biên soạn ngữ của bạn:

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

Cảm ơn, điều này cũng đã làm việc, mặc dù tôi đánh dấu Marc là câu trả lời khi tôi tìm thấy một câu trả lời khác phù hợp với nơi khác của mình. Tôi không chắc cách nào được ưa thích hơn? – Duncan

+0

@ Duncan, tôi không chắc chắn phù thủy là cách ưa thích hoặc là: (Điều này đã làm với linq hoạt động đó là ma thuật * bên trong * Tôi không tin rằng bạn sẽ nhấn bất kỳ vấn đề lớn về hiệu suất nếu bạn sử dụng một hoặc khác –

Các vấn đề liên quan