| 

.NET C# Java Javascript Exception

2
Hallo,
in meinem Programm soll der Benutzer eine Liste mit mehreren Filtern filtern können. Dazu gibt es z.B. die Filter

Func<Row, bool> name = row => row.Name.Contains(txtName.Text);
Func<Row, bool> vorname = row => row.Vorname.Contains(txt Vorname.Text);


Wie kann ich jetzt die beiden Filer ODER-Verknüpfen? Momentan mache ich effektiv das:

var ergebnisse = list.Where(name).Union(liste.Where(vorname));


Das erscheint mit sehr umständlich.
08.08.2009
gtech 65 1 4
1 Antwort
2
Mit dem PredicatBuilder ist das möglich.

Beispiel für die Verwendung (das allerdings sinnfrei ist):
// Daten:
IEnumerable<int> list = Enumerable.Range(0, 10);

// Prädikat 1. Abfrage:
Expression<Func<int, bool>> even = i => i % 2 == 0;

// Prädikat 2. Abfrage:
Expression<Func<int, bool>> odd = i => i % 2 != 0;

// Prädikat zusammengesetzt mit OR:
Expression<Func<int, bool>> all = even.Or(odd);

// Abfrage:
var query = list.Where(all.Compile());


Hintergrund:
Ein Lambdausdruck kann als Expression-Tree dargestellt werden. Dieser Expression-Tree wird mit den Erweiterungsmethoden des Predicatbuilder verändert so dass die Abfragen "dynamisch" verknüpft werden könne. Für LINQ to SQL oder LINQ in Verwendung mit dem ADO.net Entity Framework muss für Abfragen eine Expression übergeben werden. Diese wird zur Laufzeit dann ausgewertet und nach T-SQL übersetzt.
Bei Verwendung von LINQ to Objects wird eine Delegat erwartet und daher muss die Expression kompiliert werden (wie im Beispiel gezeigt).
09.08.2009
gfoidl 9,4k 3 5
2
Nice! Das taugt ja sogar für QueryProvider, die die Expressions auswerten.
gtech 09.08.2009

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH