Linq Abfrage für Grid mit Databinding

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Mark aus P.

    Linq Abfrage für Grid mit Databinding

    Hallo Zusammen,
    ich bin neu im Forum und hoffe eure Hilfe auch wenn die Frage simpel erscheint.
    Googel aber schon 4 Stunden und habe schon einiges ausprobiert!

    Habe folgende Tabellen:

    SQL-Abfrage

    1. DROP TABLE [ContainerState]
    2. DROP TABLE [BasicData]
    3. DROP TABLE [State]
    4. DROP TABLE [Type]
    5. CREATE TABLE [State]
    6. (
    7. [State_ID] INT NOT NULL PRIMARY KEY,
    8. [StateName] NVARCHAR(50) NOT NULL,
    9. [StateColor] NVARCHAR(50) NOT NULL,
    10. );
    11. INSERT INTO [State] ([State_ID], [StateName], [StateColor])VALUES (1, 'eingebucht', 'red')
    12. INSERT INTO [State] ([State_ID], [StateName], [StateColor])VALUES (2, 'fertig', 'green')
    13. CREATE TABLE [Type]
    14. (
    15. [Type_ID] INT NOT NULL PRIMARY KEY,
    16. [TypeName] NVARCHAR(50) NOT NULL,
    17. );
    18. INSERT INTO [Type] ([Type_ID], [TypeName])VALUES (1, 'EU Container 300L')
    19. INSERT INTO [Type] ([Type_ID], [TypeName])VALUES (2, 'USA Container 300L')
    20. CREATE TABLE [BasicData]
    21. (
    22. [BasicData_ID] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
    23. [ContainerName] NVARCHAR(24) NOT NULL,
    24. [Type_ID] INT NOT NULL,
    25. FOREIGN KEY (Type_ID) REFERENCES [Type]([Type_ID])
    26. );
    27. INSERT INTO [BasicData] ([BasicData_ID], [ContainerName], [Type_ID]) VALUES('{9c6b035a-4e98-4be5-aac9-caa12cf017fd}', 'Container Mark', 1)
    28. INSERT INTO [BasicData] ([BasicData_ID], [ContainerName], [Type_ID]) VALUES('{2765f806-4930-43ea-a18d-603d7812503d}', 'Container Moritz', 1)
    29. CREATE TABLE [ContainerState]
    30. (
    31. [ContainerState_ID] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
    32. [BasicData_ID] UNIQUEIDENTIFIER NOT NULL,
    33. [State_ID] INT NOT NULL,
    34. Time_Stamp TIMESTAMP NULL,
    35. FOREIGN KEY ([State_ID]) REFERENCES [State]([State_ID]),
    36. FOREIGN KEY ([BasicData_ID]) REFERENCES [BasicData]([BasicData_ID]),
    37. )
    38. INSERT INTO [ContainerState] ([ContainerState_ID], [BasicData_ID], [State_ID]) VALUES('{b89a8a6f-b774-4ec9-a772-397ebab4495c}', '{9c6b035a-4e98-4be5-aac9-caa12cf017fd}', 1)
    39. INSERT INTO [ContainerState] ([ContainerState_ID], [BasicData_ID], [State_ID]) VALUES('{c63143ee-3b9e-4d64-a703-ba6e33775563}', '{9c6b035a-4e98-4be5-aac9-caa12cf017fd}', 2)


    Und binde über den folgen VB.net Code ein DataGrid (dgCurrentState) an.

    VB.NET-Quellcode

    1. Dim myQuriy = From myBasicData In Controller.CurrentContext.BasicDatas
    2. Join myContaierState In Controller.CurrentContext.ContainerStates On myBasicData.BasicData_ID Equals myContaierState.BasicData_ID
    3. 'Select myBasicData, myContaierState
    4. dgCurrentState.ItemsSource = myQuriy.ToList()



    Das Ergebnis sieht dann so aus:
    Containername | TypeName | StateName
    Container Mark | EU Container 300L | eingebucht
    Container Mark | EU Container 300L | fertig

    Angezeigt habe will ich aber nur die Max(State_ID) für weden ContainerName also nur die zweite Zeile.

    ??????????
    WIE GEHT DAS IN LINQ

    Ihc hoffe das SQL kann man nachvollziehen!
    Danke
    Gruß
    Mark

    Mark aus P schrieb:

    WIE GEHT DAS IN LINQ
    Ganz allgemein geht das mittm Aggregate-SChlüsselwort:

    VB.NET-Quellcode

    1. Dim numbs = {Tuple.Create(3, "33"), Tuple.Create(2, "66"), Tuple.Create(6, "22"), Tuple.Create(4, "44")}
    2. Dim maximum = Aggregate i1 In From tpl In numbs Select tpl.Item1 Into Max()
    Jo, das habich absichtlich gemacht, um aufzuzeigen, dass für deine Anforderung Linq garnet die passende Technologie ist.

    Die eigentliche Datenbänkerei findet in .Net nicht in der DB statt, sondern im typisierten Dataset, oder alternativ über einen OR-Mapper.

    Beide Ansätze sind enorm leistungsfähig, sodass man alle standard-Vorgänge (CRUD - Funktionalität) z.T. mit Einzelern abhandeln kann oder auch nur duch Klicksen in den vorgesehenen Designern.

    Ich empfehle immer sehr, die Datenbank zunächst mal zu vergessen, und den Umgang mit Databinding, typisiertem Dataset, DatagridView und Datenmodellierung ühaupt zu erlernen - ich nehme mal letzteres bei dir als gegeben an, weil du so hübsches Sql schreiben kannst ;) (ich könnt's nicht).

    Jedenfalls: das alles erstmal vergessen, und die Anwendung DatasetOnly entwickeln, um Databinding, typisiertem Dataset, DatagridView kennenzulernen. Gugge DB-Programmierung ohne Datenbank und weiterführende Links.
    gugge auch vier Views für einen Überblick über Databinding, "DatasetOnly" auf Movie-Tuts für das Geklickse im Dataset-Designer (kannste auch als ein ERM-Tool betrachten), naja, "Datenbank in 10 Minuten" auf Movie-Tuts für wie man eine DB anbinden kann (aber das wolltenwaja erstmal vergessen)
    Ah, und mein Benamungs-Schema für DB-Entitäten.
    In Datenbanken mögen Prefixe vlt. Sinn haben, im typDataset gibts nur Tabellen, daher haben Prefixe dort keinen Sinn (weil ist nur ein Prefix möglich) und erzeugen nur Unleserlichkeit.

    Edit: Mist - Wpf!
    typ Dataset wird von Wpf nur teilweise unterstützt - die Xaml-Syntax ist da bisserl behindert.
    Na, da bleibt dann nicht mehr viel ausser dem Entity-Framework-Theater.
    Prinzipiell wie die Links oben, die sind allerdings auf WinForms ausgerichtet.
    Für Wpf habich nicht so viel, und mittm EF komm ich auch nicht so gut klar. Vor allem weils damit kein DatasetOnly gibt, sondern man muß immer gleich mit einer MS-SqlServer-Monster-DB loslegen, auch fürne popelige Haushaltsbuch-Anwendung.
    guggemol 4ViewsWpf - aber Achtung: das ist nicht EF, sondern LinqToSql, eine Technologie, die MS glaub nicht mehr weiter-entwickelt.
    EF tickt aber sehr ähnlich.

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