Benutzer mit den meisten Antworten
Linq Frage

Frage
-
Hallo
Ich habe eine Master->Child1->Child2 Konstellation in meiner Datenbank.
Ich lade mehrere Daten und filtere diese dann per Linq am Client für die richtige Verarbeitung. Ich versuche jetzt folgenden code:
getPositions = getPositions.Where(Function(search) search.positionen_neu_kalkulation_verskats.Where(Function(detail) detail.versgruppeid = calculation.insuranceCategory))
Das Problem: Die zweite Where Funktion kann nicht aufgelöst werden.
Wie kann ich diese Verschachtelung lösen?
DANKE im Voraus
Antworten
-
Hallo,
wenn ich dich jetzt richtig verstanden habe, suchst du so etwas:
getPositions.Where(Function(masterItem) masterItem.Any(Function(child1Item) child1Item.Any(Function(child2Item) child2Item.versgruppeid = MeinWert)))
Damit werden die Elemente heraus gesucht, die in irgend einem Child1->Child2 ein Element mit versgruppeid = MeinWert haben.
Mein Code basiert darauf, das die jeweiligen Items der Listen schon wieder neue Listen sind. Dort musst du, deinem Code entsprechend, noch auf die jeweiligen Eigenschaften zugreifen, die die Daten enthalten.
Die Abfrage mit den Joins kannst du auch im LINQ machen, nur sehe ich keine Notwendigkeit dazu.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Zero-G. _ Sonntag, 25. Januar 2015 14:26
Alle Antworten
-
Hallo,
ich vermute mal, dass positionen_neu_kalkulation_verskats dem Child1 in deiner Übersicht entspricht.Mit der Fehlermeldung wüsste ich jetzt zunächst auch nichts anzufangen, poste bitte den exakten Wortlaut.
Was allerdings den Verschachtelten Aufruf angeht, scheint da ein Fehler enthalten zu sein. Die Where-Methode erfordert eine Funktion, die einen Wahrheitswert (Boolean) zurück gibt. Deine innere Where-Methode gibt jedoch ein IEnumerable(Of T) zurück, womit die äußere Where-Funktion nichts anzufangen weis. Das kann dem entsprechend nicht funktionieren, die von dir genannte Fehlermeldung sollte da allerdings auch nicht kommen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 23. Januar 2015 18:03
-
Hallo!
Danke! - Du hast Recht mit der Fehlermeldung:
Fehler 7 Der Wert vom Typ "System.Collections.Generic.IEnumerable(Of VOPT.VOptNeuContext.positionen_neu_kalkulation_verskat)" kann nicht in "Boolean" konvertiert werden. C:\Users\Harald\Documents\Visual Studio 2010\Projects\Visual OPT .NET - MySql - Kopie\Vopt\VOPT\KrankenkassaKalkulation\Kalkulation.vb 30 68 VOPT
DANKE
-
Hallo,
wie Tom schon schreibt, die Where Erweiterungsmethode erwartet eine Funktion, die ein Boolean als Ergebnis zurück liefert, ob die Prädikat zutrifft.
Deine Methode tut das anscheinend nicht.
Gruß Elmar
-
Hallo,
dein Code macht schlicht gesagt keinen Sinn, die Frage ist daher, was du genau vor hast.Where filtert Listen mit Hilfe einer Funktion die Prüft ob ein Element in die zurück gegebene Liste soll.
Wenn du Beispielsweise nur die Child1-Listen filtern willst, so kannst du mit Select statt Where für getPositions jeweils die UnterListen auswählen. Allerdings hättest du hier dann wirklich nur verschachtelte Listen, getPositions müsste demnach ein IEnumerabl(Of IEnumerable(Of MyType)) sein.
Es gibt bei mehr Dimensionalen Listen zu viele Möglichkeiten etwas abzufragen, beschreibe daher einfach was du vor hast. Auch wäre wichtig, wie deine Listen im Code aufgebaut sind. Sind es einfache Listen (IEnumerable, List, ...) oder ist es je ein eigener Typ? Wenn es Typen sind, brauchst du diese im Ergebnis oder würden dir dort auch nur Listen reichen?Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hey
Also, eigentlich möchte ich auf der 2. Childtabelle eine Einschränkung erzielen, die mir dann eben nur die übergeordneten Daten wieder zurück liefert. - Also eine einfache Where Formulierung...
In meinem Fall:
Child 2 hat ein Feld mit dem Namen versgruppeid
Ich benötige also alle Master Datensätze, deren Child1 -> Child2.versgruppeid einem dementrsprechenden Wert liefern (calculation.insuranceCategory).In SQL würde ich das per Join erledigen Master -> Join Child -> Join Child -> Where
Gearbeitet wird mit System.Linq.Iqueryable Daten. - Dieses Format sollte auch beibehalten werden.
Danke für Tipps, wie das dann korrekt funktioniert
-
Hallo,
wenn ich dich jetzt richtig verstanden habe, suchst du so etwas:
getPositions.Where(Function(masterItem) masterItem.Any(Function(child1Item) child1Item.Any(Function(child2Item) child2Item.versgruppeid = MeinWert)))
Damit werden die Elemente heraus gesucht, die in irgend einem Child1->Child2 ein Element mit versgruppeid = MeinWert haben.
Mein Code basiert darauf, das die jeweiligen Items der Listen schon wieder neue Listen sind. Dort musst du, deinem Code entsprechend, noch auf die jeweiligen Eigenschaften zugreifen, die die Daten enthalten.
Die Abfrage mit den Joins kannst du auch im LINQ machen, nur sehe ich keine Notwendigkeit dazu.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Zero-G. _ Sonntag, 25. Januar 2015 14:26