Wie kann ich die kombinieren von LINQ-Ausdrücken in ein?
Ich habe ein Formular mit mehreren Felder (Firmenname, PLZ, etc.) die es einem Benutzer ermöglicht, um die Suche für Unternehmen in einer Datenbank. Wenn der Benutzer Werte in mehr als einem Feld, dann muss ich die Suche über alle Felder. Ich bin mit LINQ zur Abfrage der Datenbank.
So weit ich es geschafft habe, zu schreiben, eine Funktion, die schaut auf Ihre Eingabe und schalten Sie ihn in eine Liste von Ausdrücken. Ich will nun zu drehen, dass die Liste in einem einzigen Ausdruck, die ich ausführen können, über die LINQ-provider.
Mein Erster Versuch war wie folgt
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Aber dieser schlägt mit einer Ausnahme fehl-Nachricht entlang der Linien von "Der binary-operator Und ist nicht definiert...". Hat jemand eine Idee, was ich tun müssen, um zu kombinieren, diese Ausdrücke?
EDIT: Korrigiert die Zeile, wo ich vergessen hatte, weisen Sie das Ergebnis der and ' Ing die Ausdrücke zusammen, um eine variable. Danke für den Hinweis Leute.
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Jason ' s Antwort ist jetzt voller als meiner war in Bezug auf die expression tree Zeug, so habe ich entnommen, dass bit. Aber, ich wollte zu verlassen:
Ich nehme an, du verwendest diese für eine
Where
- Klausel... warum nicht einfach nennen, Wo mit jedem Ausdruck in die Reihe? Das sollte den gleichen Effekt haben:combined
eingegeben werden alsExpression
; Sie brauchen, um einige Arbeit zu tun, es zurückzugeben, wie einExpression<Func<Company, bool>>
.Können Sie
Enumerable.Aggregat
kombiniert mitAusdruck.AndAlso
. Hier ist eine generische version:Ihre aktuelle code ist nie die Zuordnung zu
combined
:gibt ein neues
Expression
das ist das Ergebnis der bitweisen und-Verknüpfungcombined
undexpr
aber nicht mutierencombined
.Where
- Klausel, dann Jon, die Antwort ist der Weg zu gehen. Wenn Sie jemals brauchen eine allgemeinere version, meine version wird Euch helfen. 🙂Hier haben wir eine Allgemeine Frage zum kombinieren von Linq-Ausdrücke. Ich habe eine Allgemeine Lösung für dieses problem. Ich werde eine Antwort in Bezug auf das spezifische problem gepostet, obwohl es definitiv nicht der richtige Weg in solchen Fällen. Aber wenn einfache Lösungen nicht in Ihrem Fall, Sie können versuchen, diese Methode verwenden.
Müssen Sie zuerst eine Bibliothek, bestehend aus 2 einfachen Funktionen. Sie verwenden
System.Linq.Expressions.ExpressionVisitor
dynamisch ändern Ausdrücken. Das entscheidende Merkmal ist die Vereinigung Parameter in der expression, so dass 2 Parameter mit dem gleichen Namen gemacht wurden, identisch (UnifyParametersByName
). Der Verbleibende Teil wird ersetzt einen benannten parameter mit dem angegebenen Ausdruck (ReplacePar
). Die Bibliothek ist mit MIT-Lizenz auf github: LinqExprHelper, aber Sie schreibt schnell etwas auf Ihrem eigenen.Die Bibliothek ermöglicht eine Recht einfache syntax für die Verknüpfung komplexer Ausdrücke. Sie können mischen inline-lambda-Ausdrücke, die sind schön zu Lesen, zusammen mit dem dynamischen Ausdruck Kreation und Zusammensetzung, die sehr fähig.