2016-12-20 1 views
0

Ich muss eine LINQ-Abfrage für eine zurückgegebene Liste schreiben, die mehrere optionale Parameter akzeptiert. Es werden die folgenden Variablen:LINQ Filterabfrage mit mehreren optionalen Parametern

Plan, Id, Vorname, Nachname, Datefrom, DateTo, MemDateOfBirth

Ich möchte eine gefilterte Liste zurück über LINQ zurückzukehren, diese Parameter verwenden, aber alle von ihnen sind optional. Mindestens eine wird geliefert, wenn der Benutzer die Suchschaltfläche drückt, aber das hängt vom Benutzer ab, um zu entscheiden, wonach er suchen möchte. Wenn sie mehr als 1 liefern, muss ich nach allen Methoden filtern, die sie liefern ...

Also zum Beispiel, wenn sie einen Vornamen und zu und von Daten liefern, möchte ich eine gefilterte Liste aller Instanzen für zurückgeben eine Person mit diesem Vornamen zwischen den Daten von und nach usw.

Was ist der einfachste Weg, dies mit LINQ zu erreichen? Diese Variablen sind optionale Parameter, so dass sie alle oder alle liefern können. Ich weiß, dass ich die Hauptliste zurückgeben und dann mehrmals filtern konnte, um die Ergebnisse zu erhalten, aber ich fragte mich, ob es einen schnelleren, einfacheren Weg über LINQ gab ...

Vielen Dank im Voraus für Ihre Hilfe !

+4

zu lösen mehr 'Where' Anrufe innerhalb' if' Aussagen. – juharr

Antwort

0

Sie können EntityFramework.DynamicFilters verwenden, mit denen Sie dynamische Filter erstellen können, oder Sie können die where-Klausel dynamisch in linq erstellen. Hier ist ein Tutorial, wie man where-Klausel dynamisch erstellt.

https://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

Dieser Filter Schöpfung ist etwas mühsam, aber dies wird Ihren Zweck dienen.

+0

Für eine einmalige Verwendung (und vordefinierte Bedingungen für jede gefilterte Spalte), ist dieser Code zu komplex ... ** und Sie müssen immer noch bestätigen, dass es mit Ihrem Provider funktioniert und die Filterung auf dem Server **. – Phil1970

+0

aber diese Lösung kann in jeder Art von Filterung verwendet werden, auch der zweite Teil wird mehr generische Ansatz gezeigt, um diesen Filter zu bauen.Check er hat 7 Artikel, um seine Kriterien zu filtern, die diese machen wird um 7! = 5040 Kombination und ich denke nicht, dass er so viele Fragen zum Filtern von Elementen machen wird. – Rajput

+0

Wenn Sie sich die Kommentare ansehen, ist einer von ihnen ** Der Ausdruckscode wird auf dem SQL-Server nicht ausgeführt **, also ist dies eine ** rote Flagge **. In jedem Fall haben Sie keine 5040 Kombinationen, da jeder Filter unabhängig aktiviert werden kann, so dass Sie nur 7 Bedingungen haben würden ... Siehe auch meine Antwort. – Phil1970

0

Unter der Annahme, dass Sie nicht wollen, dass es für viele Tabellen verallgemeinern, ich möchte etwas tun:

var query = 
    from m in db.table 
    select m; 

if (plan.HasValue) 
{ 
    query = query.Where(x => x.plan == plan.Value); 
} 

... other filters .... 

// Then use data (for ex. make a list). 
var list = query.ToList(); 

auf dem Provider Je könnten Sie auch Zustand direkt in LINQ mit so etwas wie schreiben:

from m id db.table 
where plan == null || m.plan == plan 
where... 
select m; 

oder mit !plan.HasValue || m.plan == plan.

Dies ist jedoch fragiler, da nicht alle Anbieter diese Fälle auf die gleiche Weise behandeln oder unterstützen. Man muss besonders vorsichtig sein, wenn die entsprechende Spalte null zulässt.

0

ich fand dies der einfachste Weg, um diese Art von Problem, das ich habe gerade habe

var q = from mt in myTable 
     where (mt.FIrstname == FirstNameparam || FirstNameparam == null) 
     && (mt.lastname == lastnameParam || lastnameParam == null) 
     && (mt.DateField == DateParam || DateParam == null) 
     select new 
     { 
      mt.FIrstname, 
      mt.lastname, 
      mt.DateField 
     }; 
Verwandte Themen