Laden...

LINQ Query über Variablen zusammensetzen

Erstellt von nixMehrFrei77 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.686 Views
N
nixMehrFrei77 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren
LINQ Query über Variablen zusammensetzen

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

W
872 Beiträge seit 2005
vor 5 Jahren

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.

N
nixMehrFrei77 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Vielen Dank!

5.658 Beiträge seit 2006
vor 5 Jahren

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

16.835 Beiträge seit 2008
vor 5 Jahren

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...

T
2.224 Beiträge seit 2008
vor 5 Jahren

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.

N
nixMehrFrei77 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

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.

T
2.224 Beiträge seit 2008
vor 5 Jahren

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.

N
nixMehrFrei77 Themenstarter:in
4 Beiträge seit 2018
vor 5 Jahren

Hi T-Virus,

vielen Dank für Deine Lösung!

4.939 Beiträge seit 2008
vor 5 Jahren

@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...

T
2.224 Beiträge seit 2008
vor 5 Jahren

@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.