Wir arbeiten an einem Log Viewer. Die Verwendung hat die Option, nach Benutzer, Schweregrad usw. zu filtern. In den SQL-Tagen würde ich der Abfragezeichenfolge hinzufügen, aber ich möchte dies mit Linq tun. Wie kann ich where-Klauseln bedingt hinzufügen?
c#
linq
linq-to-sql
.net-3.5
sgwill
quelle
quelle
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
Wenn Sie die Basis nach einer Liste / einem Array filtern müssen, verwenden Sie Folgendes:
quelle
Ich beendete die Verwendung einer Antwort ähnlich der von Daren, jedoch mit einer IQueryable-Oberfläche:
Dadurch wird die Abfrage aufgebaut, bevor die Datenbank aufgerufen wird. Der Befehl wird erst am Ende von .ToList () ausgeführt.
quelle
Wenn es um bedingte Linq geht, mag ich das Filter- und Rohrmuster sehr.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/
Grundsätzlich erstellen Sie eine Erweiterungsmethode für jeden Filterfall, der IQueryable und einen Parameter enthält.
quelle
Ich habe dies mit einer Erweiterungsmethode gelöst, damit LINQ in der Mitte eines fließenden Ausdrucks bedingt aktiviert werden kann. Dadurch entfällt die Notwendigkeit, den Ausdruck mit
if
Anweisungen aufzubrechen ..If()
Erweiterungsmethode:Dies ermöglicht Ihnen Folgendes:
Hier ist auch eine
IEnumerable<T>
Version, die die meisten anderen LINQ-Ausdrücke verarbeitet:quelle
Eine andere Möglichkeit wäre, etwas wie den hier diskutierten PredicateBuilder zu verwenden . Sie können Code wie folgt schreiben:
Beachten Sie, dass dies nur für Linq 2 SQL geeignet ist. EntityFramework implementiert nicht Expression.Invoke, das erforderlich ist, damit diese Methode funktioniert. Ich habe eine Frage bezüglich dieses Problems hier .
quelle
Dies tun:
mit diesem in der
where
Aussage:bedeutet , dass , wenn die endgültige Abfrage erstellt, wenn
lastNameSearch
istfalse
die Abfrage vollständig jede SQL für den Nachnamen Suche auslassen wird.quelle
Es ist nicht die schönste Sache, aber Sie können einen Lambda-Ausdruck verwenden und Ihre Bedingungen optional übergeben. In TSQL mache ich viele der folgenden Schritte, um Parameter optional zu machen:
Sie können denselben Stil mit dem folgenden Lambda duplizieren (ein Beispiel für die Überprüfung der Authentifizierung):
quelle
Ich hatte kürzlich eine ähnliche Anforderung und fand diese schließlich in der MSDN. CSharp-Beispiele für Visual Studio 2008
Mit den im DynamicQuery-Beispiel des Downloads enthaltenen Klassen können Sie zur Laufzeit dynamische Abfragen im folgenden Format erstellen:
Auf diese Weise können Sie eine Abfragezeichenfolge zur Laufzeit dynamisch erstellen und an die Where () -Methode übergeben:
quelle
Sie können diese Erweiterungsmethode erstellen und verwenden
quelle
Verwenden Sie einfach den && Operator von C #:
Edit: Ah, muss genauer lesen. Sie wollten wissen, wie Sie zusätzliche Klauseln bedingt hinzufügen können. In diesem Fall habe ich keine Ahnung. :) Was ich wahrscheinlich tun würde, ist einfach mehrere Abfragen vorzubereiten und die richtige auszuführen, je nachdem, was ich letztendlich brauchte.
quelle
Sie können eine externe Methode verwenden:
Dies würde funktionieren, kann aber nicht in Ausdrucksbäume unterteilt werden, was bedeutet, dass Linq to SQL den Prüfcode für jeden Datensatz ausführen würde.
Alternative:
Dies könnte in Ausdrucksbäumen funktionieren, was bedeutet, dass Linq to SQL optimiert wird.
quelle
Ich dachte, Sie könnten die Filterbedingungen in eine allgemeine Liste von Prädikaten aufnehmen:
Das Ergebnis ist eine Liste mit "Ich", "Ich" und "Mähen".
Sie können dies optimieren, indem Sie foreach mit den Prädikaten in einer völlig anderen Funktion ausführen, die alle Prädikate ODER-verknüpft.
quelle