Linq - Group Join - Synatax Probleme

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 160 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.

    Linq - Group Join - Synatax Probleme

    Hallo zusammen,

    ich habe ein kleines Problem mit einem Linq Befehl. Hat jemand eine Idee was ich falsch mache.

    TabelleA:
    Id | spalte2 | spalte3
    1 | test | test
    2 | test2 | test2

    TablleB:
    Id | IdTabelleA |bSpalte
    1 | 1 | testB

    TabelleC:
    Id | IdTabelleA | cSpalte
    1 | 2 | testC

    Ergebnis sollte sein:
    Id (aus TabelleA) | spalte2 | spalte3 | bSpalte | cSpalte
    1 | test | test |testB | -
    2 | test2 | test2 | - | testC

    Wenn ich Tabelle A mit Tabelle B ODER C Join dann stimmt das Join Ergebnis. Wenn ich den Group Join anwende bekomm ich auch ein Ergebnis allerdings fehlen mir die Angaben aus der gejointen Tabelle. Also nur die Aus Tabelle A werden angezeigt. Wenn ich alle drei mit dem Group Join verbinde bekomme ich nichts angezeigt. Ich denke das ich die leeren Felder mit DefaultIsEmpty abfangen muss. Aber ich bekomme es nicht hin.

    Mein Linq String

    VB.NET-Quellcode

    1. Dim q = From s In dsStammdaten.TabelleA _
    2. Group Join x In dsStammdaten.TabelleB _
    3. On s.Id Equals x.IdTabelleA _
    4. Into TabelleAB = Group _
    5. From ab In TabelleAB _
    6. Join p In dsStammdaten.TabelleC _
    7. On ab.s.Id Equals p.IdTabelleA _
    8. Select {s.Id, s.spalte2, s.spalte3, ab.bSpalte, p.bSpalte}
    9. Me.DataGridView1.DataSource = q.ToList


    Danke
    Gruß

    EDIT:
    Fehler behoben
    Warum denn tA.ID, wenn die Spalte tC.IDTabelleB heißt?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StGo“ ()

    Nein habe ich noch nicht. Habe es einzeln probiert:

    VB.NET-Quellcode

    1. Dim q = From s In dsStammdaten.TabelleA _
    2. Group Join x In dsStammdaten.TabelleB _
    3. On s.Id Equals x.IdTabelleA _
    4. Into TabelleAB = Group _
    5. Select s.Id, s.spalte2, spalte.3, TabelleAB
    6. Me.DataGridView1.DataSource = q.ToList


    Das Ergebnis ist:
    Id (aus TabelleA) | spalte2 | spalte3 |TabelleAB

    TabelleAB ist in der Ausgabe der Name der Spalte. Werte werden auch keine angezeigt.

    Gruss
    Versuche es einmal ohne Group

    VB.NET-Quellcode

    1. Dim q = From s In dsStammdaten.TabelleA _
    2. Join x In dsStammdaten.TabelleB _
    3. On s.Id Equals x.IdTabelleA _
    4. Join p In dsStammdaten.TabelleC _
    5. On s.Id Equals p.IdTabelleB _
    6. Select s.Id, s.spalte2, s.spalte3, x.bSpalte, p.bSpalte
    Das war mein erster Versuch. Beim ersten Join werden aber die zeilen verworfen die der zweite Joni braucht.


    Habe auch probiert die beiden Tabellen B und C zusammen zu fassen und sie dann zu joinen. Damit bin ich aber nicht klar gekommen.


    Gruss
    Ich könnte mir vorstellen das es so funktioniert! ;)

    Allerding ausm Kopf, könnte eventuell fehler haben.


    VB.NET-Quellcode

    1. Dim tabelleA = DataSet1.TabelleA.AsEnumerable
    2. Dim tabelleB = DataSet1.TabelleB.AsEnumerable
    3. Dim tabelleC = DataSet1.TabelleC.AsEnumerable
    4. Dim bs As New BindingSource
    5. Dim join = From tA In tabelleA, tB In tabelleB, tC In tabelleC
    6. Where tB.IDTabelleA = tA.ID And tC.IDTabelleB = tB.ID
    7. Select tA.ID, tA.Spalte2, tA.Spalte3, tB.bSpalte, tC.cSpalte
    8. bs.DataSource = join
    9. DataGridView1.DataSource = bs



    Ganz einfach mit 2 Where Klauseln, vielleicht nicht die eleganteste lösung aber dafür effektiv ;)
    Eine ähnliche Idee hatte ich auch schon. Mein war leider sehr erfolglos.

    Habe deine getestet. Jetzt zeigt mein DGV nur noch "Current" an wo auch immer das her kommt.

    Ich denke das diese Zeile
    "Where tB.IDTabelleA = tA.ID And tC.IDTabelleB = tB.ID"
    so gemeint war
    "Where tB.IDTabelleA = tA.ID And tC.IDTabelleB = tA.ID"

    Danke
    Der Fehler auf den sonne75 hingewiesen hat habe ich im ersten Post beseitig. Danke

    Das ist schon mal positiv. Wenigstens einer von uns beiden kann es. Würdest du einen Blick in meinen Code riskieren?

    VB.NET-Quellcode

    1. Public Class mrfTest1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim dsStammdaten As New DataSetStammdatenDB
    4. Dim taStammdaten As New DataSetStammdatenDBTableAdapters.StammdatenTableAdapter
    5. Dim taXls As New DataSetStammdatenDBTableAdapters.XLSTableAdapter
    6. Dim taPdf As New DataSetStammdatenDBTableAdapters.PDFTableAdapter
    7. taStammdaten.Fill(dsStammdaten.Stammdaten)
    8. taXls.Fill(dsStammdaten.XLS)
    9. taPdf.Fill(dsStammdaten.PDF)
    10. Dim Stammdaten = DataSetStammdatenDB.Stammdaten.AsEnumerable
    11. Dim XLS = DataSetStammdatenDB.XLS.AsEnumerable
    12. Dim PDF = DataSetStammdatenDB.PDF.AsEnumerable
    13. Dim bs As New BindingSource
    14. Dim q = From s In Stammdaten, x In XLS, p In PDF _
    15. Where x.IdStammdaten = s.Id And s.Id = p.IdStammdaten _
    16. Select s.Id, s.Eingabepfad, s.Ausgabepfad, x.Sheet, x.Zelle, p.Bereich
    17. bs.DataSource = q
    18. Me.DataGridView1.DataSource = bs
    19. 'Dim q = From s In dsStammdaten.Stammdaten _
    20. ' Join x In dsStammdaten.XLS _
    21. ' On s.Id Equals x.IdStammdaten _
    22. ' Select New With {s.Id, s.Eingabepfad, s.Ausgabepfad, x.Sheet, x.Zelle}
    23. 'Dim StammdatenXls
    24. 'Dim q2 = From s In dsStammdaten.Stammdaten
    25. ' Group Join x In dsStammdaten.XLS
    26. ' On s.Id Equals x.IdStammdaten
    27. ' Into StammdatenXls = Group
    28. 'From sx In StammdatenXls
    29. 'Join p In dsStammdaten.PDF
    30. 'On sx.Id Equals p.IdStammdaten
    31. 'Select {sx.Id, s.Eingabepfad, s.Ausgabepfad, sx.Sheet, sx.Zelle, p.Bereich}()
    32. 'Dim q1 = From s In dsStammdaten.Stammdaten _
    33. ' Group Join x In dsStammdaten.XLS _
    34. ' On s.Id Equals x.IdStammdaten _
    35. ' Into StammdatenXls() _
    36. ' Select New With {s.Id, s.Eingabepfad, s.Ausgabepfad, StammdatenXls}
    37. 'Dim q2 = From sx In q1.DefaultIfEmpty() _
    38. ' Group Join p In dsStammdaten.PDF _
    39. ' On sx.s.Id Equals p.IdStammdaten Into StammdatenXlsPdf = Group Select {sx.s.Id, sx.s.Eingabepfad, sx.s.Ausgabepfad}
    40. 'Dim q = From s In dsStammdaten.Stammdaten _
    41. ' Join x In dsStammdaten.XLS _
    42. ' On s.Id Equals x.IdStammdaten _
    43. ' Join p In dsStammdaten.PDF _
    44. ' On p.IdStammdaten Equals s.Id _
    45. ' Select New StammdatenXlsPdf() _
    46. ' {Id = s.Id,
    47. ' Eingabepfad = s.Eingabepfad,
    48. ' Ausgabepfad = s.Ausgabepfad}
    49. 'AddHandler DataGridView1.CellFormatting, New DataGridViewCellFormattingEventHandler(AddressOf DataGridView1_CellFormatting)
    50. End Sub


    VB.NET-Quellcode

    1. Dim dsStammdaten As New DataSetStammdatenDB
    2. Dim taStammdaten = DataSetStammdatenDBTableAdapters.StammdatenTableAdapter
    3. Dim taXls As New DataSetStammdatenDBTableAdapters.XLSTableAdapter
    4. Dim taPdf As New DataSetStammdatenDBTableAdapters.PDFTableAdapter


    Ich habe zwar bisher meist nur DataSet Only programmiert, aber ich glaube wenn du davon immer ein neues Objekt erzeugst wirst du jedes mal eine Kopie von deiner eigendlichen DB erstellen.

    Somit erstellst du durch quasi eine Kopie von der Kopie deiner Datenbank.

    Versuch es mal mit:

    VB.NET-Quellcode

    1. Dim dsStammdaten As New DataSetStammdatenDB
    2. Dim taStammdaten As New DataSetStammdatenDBTableAdapters.StammdatenTableAdapter
    3. Dim taXls = DataSetStammdatenDBTableAdapters.XLSTableAdapter
    4. Dim taPdf = DataSetStammdatenDBTableAdapters.PDFTableAdapter


    Wenn er bei dem "=" meckert dann als "AS" aber ich glaube mit New wirst du nicht glücklich auf dauer.
    Ok wie gesagt beim TableAdapter weiß ich nicht aber ich mache soetwas normalerweise auch und bei

    VB.NET-Quellcode

    1. Dim dsTblA = DataSet1.Tabelle1


    z.b. funktioniert bei mir eig. immer prima.
    Nur ist bei dir der TableAdapter ja schon erstellt und du musst diesen nur in einer neuen Variable "verpacken".

    Und mit deiner Schreibweise erstellst du ja quasi einen neuen TableAdapter von deinem schon erstellten TableAdapter.

    Steinigt mich sofern ich falsch liegen sollte :D
    Ja OK. Du könntest recht haben denn in der View steckt ja der "original TableAdapter". Aber das sollte egal sein. Denn ich fülle über den neu erzeugten ja das DataSet. Und ein simpler Join mit zwei Tabellen zeigt auch das richtige Ergebnis an. Warum sollte das dann nicht auch mit drei funktionieren?

    Danke