2016-03-23 7 views
1

Ich habe ein Szenario, in dem ich eine SQL-Abfrage mit LINQ erstellen muss, die eine variable Anzahl von OR-Klauseln enthält. Ich schreibe eine Funktion, die die Abfrage basierend auf einigen Eingaben erstellen wird. Die Funktionsdefinition sieht so etwas wie ...Wie verketten Sie OR-Klauseln mit LINQ?

function BuildQuery(ICollection<ColumnsThatNeedToBeTrue> columns) 
{ 
    ... 
} 

Also, ich bin eine Sammlung von Spalten gegeben, die ich für wahr überprüfen müssen, und die Prüfung muss OR Klauseln verwenden.

Wenn die columns Array enthält A und B, würde ich die Abfrage müssen überprüfen, ob Spalte A wahr ist oder Spalte B ist wahr.

Wenn die columns Array A enthält, B und C, würde ich brauchen abfragen und zu überprüfen, ob A OR B OR C wahr sind.

Ich weiß nicht, wie das alles innerhalb einer einzigen Where zu tun, weil ich keine Möglichkeit weiß, schrittweise auf zusätzliche || Klauseln zu kleben. Ich bin mir nicht sicher, wie ich im Folgenden, basierend auf dem Eingabearray, zusätzliche ODER-Prüfungen einschließe.

var query = entities.Where(m => m.A == true || m.B == true ...) 

Ich kann nicht Kette Where Funktionen, die jeweils für ihre eigene Spalte zu überprüfen, weil es diese Abfrage mit AND Klauseln baut und ich brauche OR.

Gibt es eine Möglichkeit, eine Abfrage wie diese mit LINQ zu erstellen?

+0

In-Klausel? http://stackoverflow.com/questions/959752/where-in-clause-in-linq –

+0

Vielleicht würde "UNION" Ihnen helfen? –

+0

Ich glaube nicht, dass es funktionieren wird, weil diese Dinge im SQL alle einzelne Spalten sind. In meiner EF-Entitätsklasse werden diese Spalten als 'bool'-Eigenschaften für jede Spalte dargestellt. Als Eingabe für meine Funktion habe ich ein Array von 'enum' angegeben, das angibt, welche Spalte auf True geprüft werden soll. Es gibt also kein echtes Array zum Vergleichen - nur einzelne Bool-Spalten/Eigenschaften. – Ryan

Antwort

3

Sie können die PredicateBuilder verwenden, um or Bedingungen zu verketten.

+0

Ist das nur C# 5+? Ich bin immer noch auf 4,5, leider. – Ryan

+0

@Ryan Nein, Sie fügen nur die PredicateBuilder-Klasse selbst hinzu. Es ist in der Seite, die ich unter "PredicateBuilder Source Code" verlinkt habe. – Magnus

+0

@Magnus Das Problem ist jedoch, dass er das ganze LinqKit braucht, weil er auf EF zielt. –

-1

Linq verwendet eine abweichende Ausführung, so dass Abfragen aufeinander aufbauen und nicht ausgeführt werden können, bis auf die Daten zugegriffen wird.

So können Sie Ihre Abfrage in einem vereinfachten Beispiel erstellen, das von externen Bedingungen abhängig sein kann, um nach Bedarf zwei spezifische where-Klauseln zu erstellen.

var myData = TheData.Where(itm => itm.Value == true); 

if ({some condition}) 
    myData = myData.Where(itm => itm.Other == true); 
else 
    myData = myData.Where(itm => itm.SomethingElse == false); 

var result = myData.ToList(); 

Das Endergebnis wird nur eine der where Klauseln aus den if und dynamisch zur Laufzeit ausgeführt werden.

+1

Problem hier ist, dass 'Wo' ein' AND' ist. Ich suche nach "OR" mit demselben Ansatz. – Ryan

Verwandte Themen