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.