2009-05-18 18 views
15

Próbuję użyć PredicateBuilder, jak opisano tutaj - http://www.albahari.com/nutshell/predicatebuilder.aspxLINQ PredicateBuilder - Wiele oddalonych

Poniższy kod

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; 

miarę widzę ten powinien pracy, zgodnie z przykładem

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; 

ale mogę to

Błąd 1 argumenty typu dla metody „System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)” nie może być wynika z użycia. Spróbuj jednoznacznie określić argumenty typu .

Próbuję uzyskać pewne zrozumienie w LINQ "on-the-job", więc przepraszam, jeśli to proste pytanie.

+0

dzięki za daj mi znać o PredicateBuilder !! – Romias

Odpowiedz

18

Ah; Twoja lista jest za pomocą metody rozszerzenie IEnumerable<T> (zamiast IQueryable<T>) - spróbuj:

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

To jedyny - dzięki! Potrzebuję dostać przyzwoitą książkę Linq, nie sądzę, że to jest coś, czego możesz się nauczyć na kopycie ... – Duncan

+2

LINQ w akcji, lub w późniejszych rozdziałach C# w Depth są całkiem dobre. –

+0

Dzięki Marc za wskazówki dotyczące LINQ w akcji. =) –

11

Spróbuj kompilacji predykat:

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

Dzięki, to też zadziałało, chociaż zaznacziłem Marc jako odpowiedź, ponieważ znalazłem inną odpowiedź, która pasowała do jego gdzie indziej. Nie jestem pewien, która droga jest preferowana? – Duncan

+0

@Duncan, nie jestem pewien, czy czarownica jest preferowanym sposobem :(To ma związek z tym, jak działa linq to magia * wewnątrz *. Nie wierzę, że uderzysz w poważne problemy jeśli chodzi o wydajność używaj jednego lub drugiego –

Powiązane problemy