Kann man LINQ-Queries auch irgendwie über Variablen zusammensetzen?
Das ist sicherlich eine Anfängerfrage, aber leider habe ich noch keine Antwort gefunden.
var fourCharPeople = from p in people
where (p.Name.Length == 4)
select p;
Wie kann man das variabler gestalten über eine individuelle Zusammensetzung per Variablen?
Ein Beispiel das nicht funktioniert 😉
string from = "from p in people ";
string where = " where (p.Name.Length == 4)";
string select = " select p;";
Vielen Dank für Eure Unterstützung
Direkt ist das nicht so einfach nicht möglich.
Es gibt aber das Nuget Paket System.Linq.Dynamic.Core, mit dem Du das machen kannst.
Hi nixMehrFrei77,
es würde aber so funktionieren:
var filteredPeople = people.Select(...);
if (applyFilter)
filteredPeople = filteredPeople.Where(m => m.Name.Length == 4)
Weeks of programming can save you hours of planning
MrSparkle's Variante ist ganz klar vor zu ziehen, wenn möglich.
Diese String-based Linq-Queries ist im Prinzip nichts anderes als ekliges Magic String gefummle...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Im Code wird dort auch nichts anderes gemacht als die Strings wieder zu Expressions zu parsen um den gleichen Code wie mit den normalen Linq Methoden zu bekommen.
Darum sollte man einen weiten Bogen machen.
Der original Autho hat sein Repository wohl auch entfernt bzw. auf nicht Sichtbar gestellt.
Vermutlich weil einfach der Anwendungszweck zu selten und zu gewagt seijn dürfte.
Mal davon abgesehen, dass man Magic Strings Libs/Lösungen immer meiden sollte, wüsste ich kaum einen sinnvollen Ansatz von solchen Lösungen.
Das konzept von Linq erlaubt dynamische Verkettungen über IQueryable wie du Sie benötigst.
Entsprechend brauchst du keine Sonderlocken, wenn man weiß das die Linq Anweisungen auch nur zu den Methoden Verknüpfungen umkompiliert werden.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Vielen Dank für Eure Rückmeldungen.
Ich stelle auf Lambda Expressions um
Eine Rückfrage hätte ich noch
var alter = 25;
var result = people.Where(wh => wh.Age > alter && wh.Age < 85).OrderBy(wh => wh.Height).ThenByDescending(wh => wh.ID);
Das funktioniert.
Ich würde jetzt gerne bei Usereingaben die "Query" modifizieren können
Bsp:
var alter = 25;
var ersteSortierung = "wh.ID";
var zweiteSortierung = "wh.Height";
var result = people.Where(wh => wh.Age > alter && wh.Age < 85).OrderBy(wh => ersteSortierung).ThenByDescending(wh => zweiteSortierung);
Das funktioniert leider nicht.
Hätte mir da jemand einen Lösungsansatz?
Danke.
So funktioniert Linq auch nicht und du willst hier wieder hin zu Magic Strings.
Du musst schon im Code mit den Objekten und ihren Properties arbeiten und nicht mit Magic Strings.
Je nachdem wer die Auswahl treffen kann, solltest du dir deine Query dann eben dynamisch zusammen setzen.
Du kanst hier einfach mit einer Methode oder Switch/Case dir die Query entsprechend erweitern.
Sind zwar etwas mehr Zeilen, ist aber auch nicht die Welt.
var alter = 25;
var ersteSortierung = "ID";
var zweiteSortierung = "Height";
var result = people.Where(wh => wh.Age > alter && wh.Age < 85);
switch(ersteSortierung)
{
case "ID":
result = result.OrderBy(wh => wh.ID);
break;
case "Height":
result = result.OrderBy(wh => wh.Height);
break;
}
switch(zweiteSortierung )
{
case "ID":
result = result.ThenByDescending(wh => wh.ID);
break;
case "Height":
result = result.ThenByDescending(wh => wh.Height);
break;
}
// Hier kannst du dann dein Result materialisieren z.B. mit .ToList();
Wenn du den Code öfters brauchst, lager ihn in eine eigene Methode aus.
Braucht mehr Code als ein Magic String Ansatz ist dafür aber sauber.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
@T-Virus: Du benutzt aber auch in deinem Beispiel die Magic-Strings "ID" und" Height" 😉
Man könnte entweder enum
benutzen oder aber
var ersteSortierung = nameof(wh.ID);
var zweiteSortierung = nameof(wh.Height);
Edit: nameof
wird noch nicht als Keyword hier im Forum dargestellt...
@Th69
Hast natürlich recht, da hab ich gepennt...
Dann würde ich eher zu Enum greifen als zu nameof.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.