none
Linq Frage RRS feed

  • 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

    Freitag, 23. Januar 2015 15:07

Antworten

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

    Freitag, 23. Januar 2015 16:48
    Moderator
  • 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

    Freitag, 23. Januar 2015 17:35
  • 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

    Freitag, 23. Januar 2015 18:54
    Beantworter
  • Hallo!

    danke für die Interpretation der Fehlermeldung!

    Aber wie wäre dann der korrekte Lösungsvorschlag?

    Wie muss die Abfrage ausschauen, damit es funktioniert?

    Schönen Abend!

    Freitag, 23. Januar 2015 22:30
  • 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

    Freitag, 23. Januar 2015 22:54
    Moderator
  • 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

     

    Samstag, 24. Januar 2015 15:57
  • 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
    Samstag, 24. Januar 2015 16:16
    Moderator
  • Hallo!

    Ja, danke! - ANY ist der Schlüssel! - Jetzt funktioniert es wie gewünscht

    DANKE - Schönes WOE noch!

    Sonntag, 25. Januar 2015 14:26