Zwei Datatables per LINQ joinen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zwei Datatables per LINQ joinen

    Hi,

    ich versuche irgendwie zwei Datatables zu joinen und in einem Datagrid darzustellen.

    Beispiel:

    VB.NET-Quellcode

    1. ​Dim query = From A In s_artalternativ.AsEnumerable
    2. Join B In s_artalternativE.AsEnumerable On
    3. A.Field(Of String)("Teil") Equals B.Field(Of String)("Teil")
    4. DataGridView1.DataSource = query

    Hierbei sind sowohl S_ArtAlternativ, als auch S_ArtAlternativE Daten, die aus zwei im Vorfeld nicht bekannten CSV-Dateien gefüllt werden. Sind also nicht schön im Designer verfügbar.
    Ich weiß aktuell nicht wie ich da das Select-Statement absetzen müsste, um die Daten zu sehen (also ALLE Felder). Irgendwie sind die meisten Infos nicht zu dynamisch generierten Datatables.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    sind das typisierte oder untypisierte DataTables?
    Welche sind die Schlüsselspalten - also Primkey der übergeordneten Datatable, Foreignkey der untergeordneten?
    Welche Datentypen haben die einzelnen Spalten (alle Spalten)?

    Oder kurz: Das Datenmodell muss bekannt sein:
    Namen der Tabellen
    Alle Namen und Datentypen aller Spalten der Tabellen
    Definition der Relation zwischen den beiden.

    muss ja sowas bei rauskommen:

    VB.NET-Quellcode

    1. Dim query = From A In s_artalternativ Join B In s_artalternativE
    2. On A.PrimKey Equals B.ForeignKey
    3. Select A.Spalte1, A.Spalte2, A.Spalte3, B.Spalte1, B.Spalte2, B.Spalte3, B.Spalte4
    Also eigentlich nicht anders als in Sql

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hi,

    danke für die Antwort!
    Es sind leider untypisierte. Ich weiß zur Programmierzeit nicht einmal welche Felder alles kommen. In dem Beispiel weiß ich nur, dass der Schlüssel "Teil" ist.

    EDIT:
    Genau da hakt es:
    Select A.Spalte1, A.Spalte2, A.Spalte3, B.Spalte1, B.Spalte2, B.Spalte3, B.Spalte4

    Denke ich zumindest. Denn, ich weiß ja nicht, welche Spalten kommen. Ich suche quasi das "Select *"
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MemoAnMichSelbst“ ()

    ok. Also PK und FK sind definiert, alle anderen Spaltennamen musste dir aus DataTable.Columns holen - schau dir das am Besten im ObjectBrowser an, wie die Zusammenhänge sind.
    Eine DataColumn hat auch Angaben zum Datentyp, aber vielleicht kannst du ja alle Spalten einfach als String abrufen.

    Besonders lausig wäre, wenn du nichtmal weisst, wieviele Columns es werden.
    Weil Linq erfordert ja die ausdrückliche Aufzählung jeder Column.
    Dann muss man mehrere queries schreiben, und je nachdem verzweigen.

    ErfinderDesRades schrieb:

    Weil Linq erfordert ja die ausdrückliche Aufzählung jeder Column.


    Das ist natürlich ungünstig. Ich hatte gehofft irgendwie "einfacher" die Tabellen verjoinen zu können, obwohl ich die Inhalte noch nicht kenne. Gibt es eine Sinnvollere Variante? Ich bin für alle Ideen offen.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    da fällt mir nur ein, alles zu Fuss zu machen.
    Eine Methode

    VB.NET-Quellcode

    1. Public Shared GruselJoin(tb1 as DataTable, tb as DataTable) as DataTable
    2. dim tblJoined As new DataTable
    3. '...
    bauen.
    Darin kannste sowas verwenden:

    VB.NET-Quellcode

    1. Dim infos = (From A In s_artalternativ Join B In s_artalternativE
    2. On A.PrimKey Equals B.ForeignKey
    3. Select A, B).ToList
    Infos ist dann eine List(Of info (as anonymDatatype)).
    Deren Elemente haben die Properties A As DataRow, B As DataRow.
    Daraus musste dann einen Eintrag für tblJoined basteln.
    Ist schwierig, und ich empfehle dir nochmal, im OB fleissig durch die beteiligten Klassen zu browsen.
    ZB eine DataRow hält alle Werte in einer Property .ItemArray.