Wie konstruiere ich eine LINQ WHERE
-Klausel, die OR
enthält?
Ich habe eine Liste von Objekten, und ich möchte jene zurückgeben, die einem Suchkriterium entsprechen.
Die enthaltenen Objekte haben viele Eigenschaften, und solange any den Kriterien entspricht, möchte ich sie zurückgeben:
%Vor%Aber das kann nicht kompiliert werden:
Operator '||' kann nicht auf Operanden vom Typ 'Lambda-Ausdruck' und 'Lambda-Ausdruck' angewendet werden
Wie konstruiere ich eine LINQ WHERE
-Klausel, die OR
enthält?
Mach einfach alle deine Tests im selben Lambda-Ausdruck ...
%Vor%Sie versuchen, jede Bedingung in einem separaten Lambda-Ausdruck auszudrücken, der nicht korrekt ist.
Sie möchten alle Ihre Ausdrücke innerhalb eines einzelnen Lambda-Ausdrucks haben:
%Vor%Nur ein anderer Ansatz, den ich für interessant halte; Es ermöglicht eine zusammensetzbare Lösung, wenn Sie es wünschen. Sie können eine Version von Prädikat-Builder verwenden, die für linq-to-objects geändert wurde. So:
%Vor%Ich habe etwas vom Standardcode abgeschnitten, um nur den Kern der Idee zu zeigen.
Der Linq-zu-Objekte-Prädikat-Builder stammt aus einer Antwort von Jon Skeet. Code hier zur Vollständigkeit geschrieben:
%Vor% Sie können mehrere lambdas nicht kombinieren. Sie möchten einen booleschen Ausdruck basierend auf der Oder-Verknüpfung ( ||
) Ihrer Bedingungen in der where
-Klausel erstellen:
Versuchen Sie, die Lambda-Deklaration bei jedem Vergleich zu entfernen ... etwas wie:
var Ergebnisse = Liste.Wohin ( (item = & gt; item.Name.Contains (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase) || item.Description.Contains (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase) || item.Description.Contains (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase) || item.ItemType.Contains (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase) || item.ItemID.ToString (). StartsWith (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase) || items.Value.ToString (). StartsWith (Schlüsselwort, StringComparison.CurrentCultureIgnoreCase));