Table of Contents

Verschachtelte Datensätze

Verschachtelte Datensätze (NestedDataSets) können Sie bei Bedarf nachladen (Lazy-Loading) oder mit Include vorab laden (Eager-Loading). Die Beispiele verwenden die Umsätze eines Artikels.

Bei Bedarf laden

var artikel = qlApp.QueryDataSet<Products>()
    .First(a => a.ArtNr == "10000");

var umsaetze = artikel.Ums!.ToList();

Beim ersten Zugriff auf Ums werden die Umsätze geladen. Weitere Zugriffe auf dieselbe Navigation desselben Objekts verwenden die bereits geladenen Daten.

Vorab laden

var artikel = qlApp.QueryDataSet<Products>()
    .Include(a => a.Ums)
    .First(a => a.ArtNr == "10000");

var umsaetze = artikel.Ums!.ToList();

Mit Include sind die Umsätze bereits geladen, wenn die Abfrage das Ergebnis zurückgibt. GraphQL lädt die ausgewählten Navigationen in derselben Anfrage.

Weitere Ebenen laden

Mit ThenInclude laden Sie untergeordnete Navigationen der zuvor ausgewählten Datensätze.

Ergebnisse projizieren

Für eine anschließende Projektion mit Select laden Sie die Ergebnisse zuerst:

var artikel = qlApp.QueryDataSet<Products>()
    .Where(a => a.ArtNr == "10000")
    .Include(a => a.Ums)
    .ToList();

var ergebnis = artikel.Select(a => new { a.ArtNr, Umsaetze = a.Ums });

Verknüpfte Tabellen laden

var adresse = qlApp.QueryDataSet<Addresses>()
    .Where(a => a.AdrNr == "10000")
    .Include(a => a.PostalAddresses)
        .ThenInclude(pa => pa.ContactPeople)
    .FirstOrDefault();

Verknüpfte Tabellen wie Anschriften und Ansprechpartner werden mit Include geladen, nicht beim Zugriff nachgeladen. null bedeutet hier: nicht geladen. Eine leere Liste bedeutet: geladen, aber keine passenden Datensätze vorhanden.

Bestimmte Verknüpfung wählen

Geben Sie eine Bedingung an, um beispielsweise nur die Rechnungsanschrift zu laden:

var adresse = qlApp.QueryDataSet<Addresses>()
    .Where(a => a.AdrNr == "10000")
    .Include(a => a.PostalAddresses,
        (a, pa) => pa.AdrNr == a.AdrNr && pa.AnsNr == a.ReAnsNr)
    .FirstOrDefault();

Alternativ können Sie den Index ausdrücklich angeben:

var adresse = qlApp.QueryDataSet<Addresses>()
    .Where(a => a.AdrNr == "10000")
    .Include(a => a.PostalAddresses,
        a => new PostalAddressesAdrNrAnsNrIdx { AdrNr = a.AdrNr, AnsNr = a.LiAnsNr })
    .FirstOrDefault();

Mehrere Varianten derselben Verknüpfung

Mit LinkHandle<T> greifen Sie über Linked getrennt auf Rechnungs- und Lieferanschriften zu:

var adresse = qlApp.QueryDataSet<Addresses>()
    .Where(a => a.AdrNr == "10000")
    .Include(a => a.PostalAddresses,
        (a, pa) => pa.AdrNr == a.AdrNr && pa.AnsNr == a.ReAnsNr, out var rechnung)
    .Include(a => a.PostalAddresses,
        (a, pa) => pa.AdrNr == a.AdrNr && pa.AnsNr == a.LiAnsNr, out var lieferung)
    .First();

var rechnungsanschriften = adresse.Linked(rechnung);
var lieferanschriften = adresse.Linked(lieferung);

Die Navigationseigenschaft selbst enthält die zuerst geladene Variante.

Felder untergeordneter Datensätze auswählen

WithFields begrenzt die Felder der zuvor ausgewählten Navigation:

var artikel = qlApp.QueryDataSet<Products>()
    .Include(a => a.Ums)
        .WithFields(u => new { u.Jahr, u.UmsMrz })
    .First(a => a.ArtNr == "10000");

Untergeordnete und verknüpfte Zeilen werden ohne eigene Seitennavigation geladen. Berücksichtigen Sie das bei großen Kindtabellen.