Linq, mehrere Tabellen, gruppieren - Verständnisfrage

  • VB.NET

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

    Ja, z.B.
    Bis < 4.7 braucht man ein Zusatzpaket, ab 4.7 ist es inklusive, siehe ValueTuple
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    So, NuGet deinstalliert, FW 4.8 installiert und eingestellt. Rechner neu gestartet und leider immer noch der gleiche Fehler bei NEXT

    Muss eigentlich bei With {. nicht mindestens meine drei Felder auftauchen? Wenn ja, dann tun sie es bei mir nicht. (gerade per Zufall mal getestet) Bei Row. funktioniert das mit den Vorschlagswerten.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Volker Bunge“ ()

    Dann muss es anders gehen. Schau Dir die TestApp im Anhang an und finde den relevanten Unterschied - wenn man von der Datengenerierung absieht.
    Dateien
    • WindowsApp2.zip

      (18,96 kB, 50 mal heruntergeladen, zuletzt: )
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank für die kleine App. Die funktioniert nach installation von FW 4.7.2 auch super

    Habe dann Deinen Button1_Click Code 1:1 in meinen kopiert und getestet. Leider das gleiche. NEXT meckert.

    Dann habe ich mir mal die beiden Source Ergebnisse angesehen.

    Hier ist schon ein kleiner (aber auch feiner?) Unterschied zu sehen. (Das eine Ergebnis hat runde Klammern und das Andere nicht, mal von den fehlenden Spaltenbezeichnungen in Deinem BSp. abgesehen) Liegt der Fehler jetzt vielleicht schon in der Abfrage? Das Ergebnis ist aber richtig. Somit funktioniert die Filterung nach der Eingabemaske hier schon.
    Bilder
    • Bild1.jpg

      294,43 kB, 1.053×695, 46 mal angesehen
    • Bild2.jpg

      206,03 kB, 924×695, 40 mal angesehen

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

    Was siehst Du denn für Unterschiede? Dass in Deiner DataSource ArtikelID, Bezeichnung und Wert stehen?
    Moment mal. Von welchem Typ laut Compiler ist denn das lokale LINQ_Query? Also das hier:

    VB.NET-Quellcode

    1. Dim LINQ_Query = From DT1…
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das bringt uns jetzt nicht so weit.
    Fahr mal, wenn Dein Programm nicht läuft, mit der Maus über LINQ_Quary und mach n Screenshot. Sowas wie im Anhang müsste rauskommen.
    Bilder
    • TypeAtDesignTime.png

      3,25 kB, 375×50, 43 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Da Du die LINQ-Abfrage geändert hast, hat es gedauert, bis ich mir den anonymen Typen nachbauen konnte.
    Ok, bei der Deklaration/Weitergabe von anonymen Typen über die Prozedurgrenze hinaus bin ich raus. Weiß gar nicht, ob das geht. Habe neulich ein EF Core-Tutorial gesehen, da meinten die, dass das nicht möglich wär, aber keine Ahnung, ob das aus dem Zusammenhang gerissen ist.
    Wenn Du das Befüllen in derselben Sub machst, geht es (bei mir):

    VB.NET-Quellcode

    1. Dim LINQ_String = From DT1 In _Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_variable_Datentabelle_Root_1_Bereiche
    2. Join DT2 In _Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_variable_Datentabelle_Felder
    3. On DT1.FeldnameID Equals DT2.ID
    4. Where DT2.EingabemaskeID = EingabemaskeID_Filter
    5. Order By DT1.ArtikelID
    6. Select DT1.ArtikelID, DT2.Bezeichnung, DT1.Wert
    7. Dim TreeViewDatenList As New List(Of TreeViewDaten)
    8. For Each Row In LINQ_String
    9. TreeViewDatenList.Add(New TreeViewDaten With {.ArtikelID = Row.ArtikelID, .Bezeichnung = Row.Bezeichnung, .Wert = Row.Wert})
    10. Next
    11. Dim t = From tv As TreeViewDaten In TreeViewDatenList
    12. Where (tv.Wert = "4")
    13. Select tv
    14. DGridView_TreeView_Suche.DataSource = t.ToList
    Ach ja, LINQ_String ist immer noch kein String, obwohl es der Name suggeriert, aber wurscht.

    ##########

    Puh, über Reflection kann man doch was machen. Aber an ne Sub wird nur ne List(Of Object) weitergegeben:

    VB.NET-Quellcode

    1. ProcessAnonymousList(LINQ_String)
    2. '…
    3. Private Sub ProcessAnonymousList(AnoynmousList As IEnumerable(Of Object))
    4. Dim TreeViewDatenList As New List(Of TreeViewDaten)
    5. For Each Element In AnoynmousList
    6. For Each ElementProperty In Element.GetType.GetProperties()
    7. Dim PropertyName = ElementProperty.Name
    8. Dim PropertyValue = ElementProperty.GetValue(Element)
    9. Dim NewData = New TreeViewDaten
    10. If PropertyName = NameOf(NewData.ArtikelID) Then NewData.ArtikelID = CInt(PropertyValue)
    11. If PropertyName = NameOf(NewData.Bezeichnung) Then NewData.Bezeichnung = PropertyValue.ToString
    12. If PropertyName = NameOf(NewData.Wert) Then NewData.Wert = PropertyValue.ToString
    13. TreeViewDatenList.Add(NewData)
    14. Next
    15. Next
    16. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo VaporiZed,

    erst einfach mal viiiiiiiiieeeeellllllllleeeeeeeennnnnnnnnn Dank für Deine Arbeit und Dein Können.

    Es klappt. Endlich

    Den zweiten Teil werde ich mir mal bei Gelegenheit anschauen.

    Habe jetzt alle Filterungen in die eine Sub gesteckt. Somit ist mein Hauptcode schlanker und alle Filterungen sind an einer Stelle. Hat somit auch seinen Vorteil.

    Dann mache ich mich mal an den Rest.

    Meldungen hierzu werden mit Sicherheit kommen, aber dann unter einem neuen Thema.

    Schönen Sonntag noch.

    Volker
    Ergebnismenge ohne anonyme Typen:

    VB.NET-Quellcode

    1. Dim TreeViewDatens = From DT1 In _Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_variable_Datentabelle_Root_1_Bereiche
    2. Join DT2 In _Modelldatenbank_VB_Net_2019_DatenDataSet.Artikel_variable_Datentabelle_Felder
    3. On DT1.FeldnameID Equals DT2.ID
    4. Where DT2.EingabemaskeID = EingabemaskeID_Filter AndAlso DT1.Wert = "4"
    5. Order By DT1.ArtikelID
    6. Select New TreeViewDaten With {.ArtikelID = DT1.ArtikelID, .Bezeichnung = DT2.Bezeichnung, .Wert = DT1.Wert}
    7. DGridView_TreeView_Suche.DataSource = TreeViewDatens.ToList

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()