"Oder" -Äquivalent in Linq Where () Lambda-Ausdruck

90

Gibt es in Linq eine Methode, mit der Sie SQL-Zeichenfolgen wie "... wo (a = 1) ODER (a = 2)" erstellen können?

dstr
quelle
4
Ich gehe davon aus, dass Sie wissen, wie man ||etwas Dynamisches benutzt und wollen a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Vielleicht möchten Sie das klarer
sagen

Antworten:

189

Sie können dies sicherlich innerhalb einer Where-Klausel (Erweiterungsmethode) tun. Wenn Sie jedoch eine komplexe Abfrage dynamisch erstellen müssen, können Sie einen 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 );
Tvanfosson
quelle
Dies funktionierte hervorragend, da ich mein Or in Abhängigkeit von den Werten der eingehenden Parameter erstellen musste - Super!
Mark
Sehr cool. Es ist eine Schande, dass dies nicht standardmäßig als Funktion in .NET enthalten ist.
maxp
1
Sehr schöne Implementierung, obwohl möglicherweise nicht bemerkt wurde, dass dies nur für C # 5+ funktioniert.
Thomas.Donnelly
24

Sie können die standardmäßigen booleschen .NET-Operatoren in Ihrer einzelnen where-Klausel verwenden:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b')
Simon Steele
quelle
19

Sie verwenden dieselben Operatoren wie in normalem C # ===> || für "oder" && für "und" etc.

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s
Muad'Dib
quelle
1

.Where()Verwenden Sie in Ihrem Anruf den Standard-Booleschen Operator 'Oder' ||.

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

Der Where-Aufruf ist lediglich ein boolescher Vergleich für alles, was Sie möchten, sodass Sie ihn mit so viel bedingter Logik füllen können, wie Sie möchten.

Alastair Pitts
quelle
0

Wenn Sie die Anzahl der Parameter nicht kennen, können Sie Folgendes verwenden:

Beispieldaten

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

Code

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();
Bora Aydın
quelle
-1

Dies ist jetzt in .net integriert, nicht sicher, ob es vorher nicht war. Bei einer vorhandenen Linq-Abfrage können Sie eine where-Klausel hinzufügen, die ein Array von Zeichenfolgen (SearchStrings) enthält, und prüfen, ob eine dieser Zeichenfolgen mit dem Objekt in der Sammlung übereinstimmt, nach der Sie suchen. Durch die Verwendung von ToLower () wird lediglich sichergestellt, dass bei SQL-Abfragen die Groß- und Kleinschreibung nicht berücksichtigt wird.

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

Sie können dasselbe für ein 'und' Prädikat tun, indem Sie alle Wörter im Array mit dem Objekt der Sammlung abgleichen.

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

In diesem Beispiel korreliert i mit jedem Objekt in einer Sammlung und s mit jeder Zeichenfolge im SearchStrings-Array.

JMacor
quelle
1
Beachten Sie, dass 'Any' nicht von einem EF-Anbieter übersetzt werden kann und lokal ausgewertet wird, was zu einem vollständigen Tabellenscan und einer In-Memory-Filterung führt.
Wade Bee