Entity Framework Core - Include bzw. ObservableCollection

  • VB.NET
  • .NET 5–6

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Entity Framework Core - Include bzw. ObservableCollection

    Hallo,

    ich habe folgende Tabellen:

    Kategorie 1-N Kunden 1-N Aufträge

    Ich möchte jetzt sowohl die Kunden nach einer Kategorie selektieren, als auch die Aufträge nach einen bestimmten Zeitpunkt.

    Ich habe es mit dem Befehl Include probiert, leider klappte die Selektierung der Aufträge nicht (Syntaxproblem).

    Weiterhin möchte ich nach der Selektierung die Abfrage in eine ObservableCollection casten.

    Kennt sich jemand aus?

    Bin auch für Literaturtipps dankbar (Bitte mit Visual Basic). Leider kann man die C-Syntax nicht problemslos nach Visual Basic konvertieren.

    Danke

    Dirk

    Dirk2006 schrieb:

    Ich habe es mit dem Befehl Include probiert, leider klappte die Selektierung der Aufträge nicht (Syntaxproblem).


    Tabellen-Verknüpfungen wird mittels Join abgebildet, die Datum-Bedingung mittels Where.

    Lies die Doku dazu.
    Bist du in Sql unterwegs oder in vb.net mittm EntityFramework?
    Die genannten schlüsselworte sind bei beiden gleich, allerdings die Doku ist jeweils eine andere.

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

    Wenn du Probleme bei der Konvertierung von c# nach vb hast, kannst du auch einfach dieses Tool benutzen.

    Wie hast du die Basisdaten denn bisher bei dir in der Anwendung vorliegen?

    Einen einfachen Cast von Resultset zu ObservableCollection kenne ich nicht. Da muss man denke ich selbst Hand anlegen.
    Dazu müsste man als Basis erstmal eine Klasse(/Klassen) erstellen, die einen Datensatz deiner Abfrage repräsentiert. In etwa sowas:

    VB.NET-Quellcode

    1. Public Class Auftrag
    2. Property ID as Integer
    3. Property KundenID as Integer
    4. Property Kunde as Kunde
    5. Property Zeitpunkt as Date
    6. End Class
    Ah - EF, steht ja inne Überschrift.

    Ja da muss man garnix coden, das stellt der ObjectContext alles von vornherein bereit:

    VB.NET-Quellcode

    1. 'Ich möchte jetzt sowohl die Kunden nach einer Kategorie selektieren, als auch die Aufträge nach einen bestimmten Zeitpunkt.
    2. Dim alleKategorien = context.Kategorien
    3. dim Kategorie3 = alleKategorien(3)
    4. dim alleKundenVonKat3 = Kategorie3.Kunden
    5. dim alleAufträgeAb2022 = context.Aufträge.Where(Function(auftr)auftr.AngelegtDatum > #1/1/2022#)

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

    Hallo,

    statt Dim Kategorie3 = alleKategorien(3)' habe ich es mit SingleOrDefault(Function(x)) probiert. Das läuft dann ohne Fehlermeldung.

    Die nächste Zeile dim alleKundenVonKat3 = Kategorie3.Kunden ergibt bei mir ein 0 Count, d.h. es werden keine Elemente gefunden.

    Die Zeile

    VB.NET-Quellcode

    1. Dim alleAufträgeAb2022 = context.Aufträge.Where(Function(auftr)auftr.AngelegtDatum > #1/1/2022#)
    läuft fehlerfrei durch, zeigt aber alle Aufträge an, d.h. es wird nur die Bedingung er Zeile erfüllt. Die oben genannte Bedingung der Kategorie wird nicht berücksichtigt.

    mfg

    DIrk

    CodeTags und Inline-CodeTags gesetzt ~VaporiZed

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

    Damit hast Du aber leider nicht beantwortet, welche Fehlermeldung Du bei alleKategorien(3) bekommst. Das wäre gut zu wissen, um den Fehler einzugrenzen. SingleOrDefault(Function(x)) ohne konkrete Einschränkung alias Predicate ergibt eines Syntaxfehler. Das ist etwas frustrierend, wenn zuviel hier spekuliert werden muss, weil konkrete Infos fehlen.
    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.
    Hallo.

    die Aufgabe ist doch oben klar definiert.

    Statt 'alleKategorien(3)' habe ich die Kategorie anders festgelegt. Der Syntax 'alleKategorien' ergibt eben einen Syntaxfehler, d.h. die Anweisung kann nicht übersetzt werden.

    Ist aber auch nicht von Bedeutung, weil ich es eben anders gelöst habe.

    Das Problem liegt höchstwahrscheinlich daran, dass die Verknüpfung 'dim alleKundenVonKat3 = Kategorie3.Kunden' schon nicht richtig läuft.

    Dazu kommt noch, dass die Anweisung 'dim alleAufträgeAb2022 = context.Aufträge.Where(Function(auftr)auftr.AngelegtDatum > #1/1/2022#)'

    sich direkt auf den Context bezieht und und alle Aufträge des Filters lädt.

    Eine Verknüpfung im Context findet nicht statt. Die Anweisung 'dim alleKundenVonKat3 = Kategorie3.Kunden' ist nutzlos.

    Trotzdem vielen Dank für die Bemühungen.

    Dirk
    Ich versuch es nochmal anders: mit welcher Variable kommst Du an alle Daten? ErfinderDesRades hatte in Post#4 ein Beipiel gemacht, worauf man aufbauen könnte, wenn man die Details hat. Das Objekt, von dem alles erreichbar ist, heißt bei Dir vielleicht nicht context. Wie heißt es bei Dir? Dann eben noch: Wie heißt die Tabelle mit den Kategorien, mit den Kunden, mit den Aufträgen. Wenn wir das wissen, könnten wir ans Ziel kommen. Wenn das Gesamtdatenzugriffsobjekt Gesamtpaket heißen sollte, und die Tabellen Kategorien, Kunden und Aufträge heißen, dann könnten wir auch funktionierende Codebeispiele posten, also z.B.

    VB.NET-Quellcode

    1. Dim GewünschteAufträge = Gesamtpaket.Kategorien.Single(Function(x) x.Name = "Bauteile").Kunden.Single(Function(x) x.Kundennummer = 12345).Aufträge(Function(x) x.Auftragsdatum > #01/01/2023#)
    Aber derzeit fischen wir etwas im Trüben :/
    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.