[Linq] Header aus Datatable in Linq-Abfrage mit ausgeben

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    [Linq] Header aus Datatable in Linq-Abfrage mit ausgeben

    Hi!

    Kurze zur Funktionalität:
    Ich habe zwei Datatables

    Tablename: Differences
    Person | A | B | C |D
    Person1|0 |-2 | 1 |8
    Person2|4 | 5 | 6 |7

    Tablename: age
    Person | A | B | C | D
    Person1|30 |20 | 2|12
    Person2| 1 | 2 | 3|4

    Ziel ist folgendes:
    Pro Person brauche ich eine Tabelle mit den Top3-Werten aus Tabelle "Differences" und den dazugehörigen Werten aus der Tabelle "Age".

    Das erreiche ich wie folgt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim differences = New DataTable()
    3. Dim age = New DataTable()
    4. For Each t In {differences, age}
    5. For Each v In {"Person", "A", "B", "C", "D"}
    6. t.Columns.Add(v, If(v = "Person", GetType(String), GetType(Integer)))
    7. Next
    8. Next
    9. differences.Rows.Add("Person1", 0, -2, 1, 8)
    10. age.Rows.Add("Person1", 30, 20, 2, 12)
    11. differences.Rows.Add("Person2", 4, 5, 6, 7)
    12. age.Rows.Add("Person2", 1, 2, 3, 4)
    13. Dim s As String = linq_query_test(differences, age)
    14. MsgBox(s)
    15. End Sub


    VB.NET-Quellcode

    1. Private Function linq_query_test(ByRef datatable1 As DataTable, ByRef datatable2 As DataTable) As String
    2. Dim result = From d_row In datatable1.AsEnumerable()
    3. Group Join a_row In datatable2 On a_row("Person") Equals d_row("Person")
    4. Into rows = Group
    5. Let match = rows.First()
    6. Select New With
    7. {
    8. '.header = d_row(0),
    9. .key = d_row("Person"),
    10. .Values = d_row.ItemArray.Skip(1).Zip(match.ItemArray.Skip(1), Function(a, b) Tuple.Create(a, b)) _
    11. .OrderByDescending(Function(t) t.Item1) _
    12. .Take(3) _
    13. .ToArray()
    14. }
    15. Return (String.Join(Environment.NewLine, result.Select(Function(a) String.Format("{0}: {1}", a.Key, String.Join(", ", a.Values.Select(Function(t) String.Format("[{0} {1}]", t.Item1, t.Item2)))))))
    16. End Function


    Ihr könnt das Testen, das läuft so durch. Was ich jetzt aber noch brauche sind die Informationen über die Header aus den Datatables. In diesem Falle "Person", "A","B","C","D". (Ich dachte eigentlich ich könnte das mit der auskommentierten Zeile ('.header = d_row(0),) bewerkstelligen, aber das funktioniert nicht.)

    Also als Return:
    Person | A | B | C
    Person1|[8 12] [1 2] [0 30]
    Person2|[7 4] [6 3] [5 2]

    Kann mir da vielleicht jemand helfen?

    VG

    Rüdi
    arbeite dich mal in ordentliche Datenmodellierung ein.
    So kann dir niemand helfen.
    Selbst wenn jmd. dir eine Wurstel-Lösung präsentiert, ist das eher ein Schaden, denn das verfestigt deine schlechte Angewohnheit, dich mit untypisierten Datasets rumzuwursteln.
    die relationale GrundIdee

    vier Views-Videos

    hier kann man erst weiterreden, wenn du ein Datenmodell im DatasetDesigner hingekriegt hast, und davon Screenshot posten.
    Weil LinqToDataset meint typisiertes Dataset.