2009-05-18 6 views
15

Ich versuche, die PredicateBuilder zu verwenden, wie hier beschrieben - http://www.albahari.com/nutshell/predicatebuilder.aspxLinq PredicateBuilder - Mehrere RUP

Der folgende Code

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; 

soweit ich das sehen sollte Arbeit, nach der Beispiel

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; 

aber alles, was ich bekommen ist

Fehler 1 Die Art Argumente für Verfahren 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' nicht aus der Nutzung geschlossen werden kann. Versuchen Sie , indem Sie die Typargumente explizit angeben.

Ich versuche, etwas Verständnis in LINQ "on-the-Job" zu bekommen, so entschuldigt, wenn dies eine einfache Frage ist.

+0

Dank für mich über PredicateBuilder wissen lassen !! – Romias

Antwort

18

Ah; Ihre Liste wird mit IEnumerable<T> Erweiterungsmethoden (statt IQueryable<T>) - versuchen:

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

Das ist der eine - danke! Ich muss mir ein anständiges Linq-Buch besorgen, ich glaube nicht, dass es etwas ist, was man auf dem Huf lernen kann ... – Duncan

+2

LINQ in Aktion oder die späteren Kapitel von C# in Depth sind ziemlich gut. –

+0

Danke Marc für die Hinweise über LINQ in Aktion. –

11

Versuchen Sie Ihr Prädikat Kompilieren:

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

Danke, das hat auch funktioniert, obwohl ich Marc als Antwort markiert habe, da ich eine andere Antwort gefunden habe, die zu seinem anderen passt. Ich bin mir nicht sicher, welcher Weg bevorzugt wird. – Duncan

+0

@Duncan, Ich bin mir nicht sicher, Hexe ist der bevorzugte Weg entweder :(Dies hat damit zu tun, wie linq funktioniert es ist * innen * magisch. Ich glaube nicht, dass Sie irgendwelche größeren Probleme in Bezug auf die Leistung treffen werden, wenn Sie nimm das eine oder das andere. –