Dynamische LINQ-Expressions
Wenn man LINQ-Abfragen etwas dynamischer zusammen bauen möchte, sehnt man sich schnell nach den alten SQL Strings zurück. Das war völlig flexibel, aber auch fehleranfällig. Ein von mir abonnierter Blog hat das Thema aufgegriffen und eine kleine Lösung dafür vorgestellt: Klick hier.
Allerdings fand ich das Vorgehen mit Expressions sehr kompliziert, zumindest für diesen Sachverhalt. Ich habe darum das Beispiel einmal auf meine Herangehensweise umgebaut:
private static void Main(string[] args) { var people = new List<Person>() { new Person() { Firstname = "Carl", Lastname = "Sample" }, new Person() { Firstname = "Mark", Lastname = "Schulz" } }; var filtered = people.AsQueryable(); var queryFirstnames = true; var queryLastnames = true; var searchValue = "l"; if (queryFirstnames) { filtered = filtered.Where(p => p.Firstname.Contains(searchValue)); } if (queryLastnames) { filtered = filtered.Where(p => p.Lastname.Contains(searchValue)); } Console.WriteLine(filtered.Count()); Console.ReadKey(); } |
Da die Abfrage von LINQ erst so spät als möglich ausgeführt wird, können auch mehrere Bedingungen hintereinander gehängt werden, oder eben auch nicht. Dadurch entsteht automatisch eine AND Verknüpfung. Möchte man eine OR Verknüpfung, so leidet die Lesbarkeit etwas, da man dann mit LINQ Union arbeiten muss.
Nachteil meiner Lösung ist aber, dass man den Zugriff auf die Daten und den Zusammenbau der Abfrage zusammen codieren muss. Sofern das kein Problem darstellt, finde ich diesen Weg etwas übersichtlicher.