Laden...

Linq: n zu n Resultate filtern (OrWhere)

Erstellt von sra vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.295 Views
S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren
Linq: n zu n Resultate filtern (OrWhere)

Hallo nochmal

Nochmal das Beispiel mit Benutzern und Registern, aber eine andere Frage.

Ich habe eine Tabelle Benutzer, eine Tabelle Register und eine Tabelle RegisterZuBenutzer, da jeder Benutzer mehrere Register haben kann und umgekehrt.

Oberhalb des Gridviews, das mir alle Kombinationen ausgibt, habe ich eine Checkboxlist, in der ich alle Register ausgebe. Wenn ich also ein oder mehrere der Register markiere und auf "filtern" klicke, dann sollen alle Benutzer ins Gridview kommen, die einem der markierten Registern zugewiesen sind.

Versucht habe ich es folgendermassen:


        Dim reg = From r As ListItem In Me.lstRegister.Items Where r.Selected Select r.Value
        For Each r In reg
            user = user.Where(Function(u) u.RegisterIDs.Contains(Integer.Parse(r)))
        Next

RegisterIDs ist eine List<integer>

Der Fehler da dran ist, dass mir dieser Code ANDs zwischen die Statements knüpft, obwohl ich da ORs bräuchte. Ausserdem bräuchte ich eine Klammer um all diese ORs, da ich unter umständen noch weitere Filter per .where anhänge (zB. Datumsfilter).

Wie muss ich das angehen?

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo sra,

Der Fehler da dran ist, dass mir dieser Code ANDs zwischen die Statements knüpft, obwohl ich da ORs bräuchte.

ich sehe in deinem Code überhaupt nicht durch, wo da AND-Verknüfungen sind und OR-Verknüfungen sein sollten oder wo du Klammern drum machen möchtest... X(

Gruß,
dN!3L

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo sra,

ah, ich glaub, ich verstehe, was du vorhast. Sollte folgendermaßen gehen:


var reg = this.lstRegister.Items.Where(i => i.Selected).Select(i => Int32.Parse(i.Value));
users = users.Where(u => u.RegisterIDs.Intersect(reg).Count()>0);

Der Trick ist, einmal IEnumerable.Intersect() zu verwenden, statt diese komische foreach-Schleife, die immer weiter selektiert.

Gruß,
dN!3L

S
sra Themenstarter:in
230 Beiträge seit 2004
vor 14 Jahren

Hallo dN!3L

Ganz grandios! Genau so geht es (und macht auch Sinn).
Musste zwar vorgängig .ToList machen, da er den Befehl nicht in SQL umwandeln kann, aber funktioniert bestens.

Danke
sra

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso