2010-01-20 9 views
73

Gibt es eine Methode in Linq, wo Sie SQL-Strings wie "... wo (a = 1) OR (a = 2)" erstellen können?"Or" Äquivalent in Linq Wo() Lambda-Ausdruck

+3

Ich nehme an, Sie wissen, wie man '||' verwendet und etwas Dynamisches, wie 'a = a.where (Stunde => Stunde <20) will; wenn (Wochenende) a = a.wo (Stunde => Stunde> 6); '. Vielleicht möchten Sie das deutlicher machen ... – Kobi

Antwort

154

Sie können es auf jeden Fall tun, innerhalb einer Where-Klausel (Extension-Methode). Wenn Sie eine komplexe Abfrage dynamisch erstellen müssen, können Sie jedoch PredicateBuilder verwenden.

var query = collection.Where(c => c.A == 1 || c.B == 2); 

Oder mit einem PredicateBuilder

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == 1); 
if (allowB) 
{ 
    predicate = predicate.Or(f => f.B == 1); 
} 

var query = collection.Where(predicate); 
+0

Schöne Verwendung der Prädikate! +1 :) –

+0

Dies funktionierte großartig, wie ich meine Or abhängig von den Werten der eingehenden Parameter aufbauen musste - Super! – dadwithkids

+0

Sehr cool. Es ist eine Schande, dass dies nicht als eine Funktion innerhalb von .NET als Standard enthalten ist. – maxp

20

Sie können die Standard-.NET Booleschen Operatoren in Ihrem Einzel where-Klausel verwenden:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b') 
+4

Ich denke, das ist die beste und einfachste Antwort. – user1477388

+1

Dies ist die einfachste Antwort. – Eranda

16

Sie verwenden die alle die gleiche Operatoren wie in normalem C# ===> || für „oder“ & & für „und“ usw.

var something = from s in mycollection 
       where s.something == 32 || 
         s.somethingelse == 45 
       select s 
+1

Ich bevorzuge diese Methode, es sieht natürlicher aus – nXqd

1

in Ihrem .Where() Aufruf verwenden den Standard Boolean 'Or' Operator, ||.

var query = items.Where(item => (item == 1 || item == 2)); 

All Wo Anruf tut, ist ein boolescher Vergleich auf, was Sie wollen, so dass Sie es mit so viel bedingte Logik füllen können, wie Sie möchten.

0

Dies ist jetzt in .net eingebaut, nicht sicher, ob es vorher nicht war. Bei einer vorhandenen Linq-Abfrage können Sie eine where-Klausel hinzufügen, die ein Array von Strings (SearchStrings) akzeptiert, und überprüfen, ob eines von ihnen mit dem Objekt in der Sammlung übereinstimmt, die Sie suchen. Die Verwendung von ToLower() sorgt dafür, dass Sie die Groß-/Kleinschreibung in SQL-Abfragen vermeiden.

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower())); 

Sie können das gleiche tun für ein ‚und‘ Prädikat durch alle Wörter in dem Array die Objektsammlung entsprechen.

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower())); 

In diesem Beispiel korreliert i in einer Sammlung für jedes Objekt, und s korreliert in der SearchStrings Array zu jeder Saite.