Abfrage- und Schreiboptionen
WithOptions ergänzt eine Abfrage um
GraphQlQueryOptions<T>;
Save und
Remove nehmen Optionen für den
jeweiligen Schreibaufruf entgegen.
Abfrageoptionen
| Option | Wirkung |
|---|---|
NearestMatch() |
nächsten passenden Indexeintrag suchen |
ModifyLsn(wert) |
erwarteten Änderungsstand angeben |
UseCurrent() |
aktuellen Datensatz des API-Kontexts lesen |
UseContext() |
Datensatz aus dem API-Kontext lesen |
KeyFilter |
Schlüssel der gewählten Sortierung einschränken |
SortBy<TIndex>() |
Sortierfolge des Servers über den Indextyp wählen |
NearestMatch, ModifyLsn und die Kontextauswahl verwenden Einzelabfragen
mit First oder FirstOrDefault. Für NearestMatch und KeyFilter muss ein
passender Index verfügbar sein.
var artikel = qlApp.QueryDataSet<Products>(includes: ["ArtNr", "SuchBeg"])
.Where(p => p.ArtNr == "10000")
.WithOptions(o =>
{
o.NearestMatch();
o.KeyFilter.Eq(p => p.ArtNr, "10000");
})
.FirstOrDefault();
Sortierfolge wählen
Der Server sortiert nach festen Sortierfolgen. SortBy<TIndex>() wählt sie über den Indextyp,
weil mehrere Sortierfolgen dieselben Schlüsselfelder haben können: ProductsNrIdx sortiert
ArtNr als Text, ProductsNrNumIdx numerisch.
var artikel = qlApp.QueryDataSet<Products>(includes: ["ArtNr", "LagNr"])
.WithOptions(o => o.SortBy<ProductsNrNumIdx>())
.Where(p => p.LagNr != null)
.Take(100)
.ToList();
Der Server sortiert ausschließlich aufsteigend und paginiert nur vorwärts. OrderBy und
OrderByDescending sortieren weiterhin im Arbeitsspeicher und bleiben davon unberührt.
Schränkt die Abfrage bereits einen Indexbereich ein, gilt dessen Sortierfolge. Eine abweichende
Auswahl mit SortBy wirft eine InvalidOperationException, ebenso die Kombination mit
NearestMatch oder einer Einzelabfrage über First beziehungsweise FirstOrDefault.
Nur anlegen, wenn noch nicht vorhanden
var artikel = qlApp.AddDataSet<Products>();
artikel.ArtNr = "TEST123";
artikel.SuchBeg = "Testartikel";
artikel.Save(o => o.IfNotExists(p => p.ArtNr == "TEST123"));
Die Bedingung unterstützt Gleichheit und Kombinationen mit &&.
Ohne Bedingung leitet IfNotExists()
den Schlüssel aus den Modellwerten ab.
Änderungsstand prüfen
Mit ModifyLsn übergeben Sie bei Abfragen,
Änderungen oder Löschungen den zuvor gelesenen
LSN-Wert. Verwenden Sie den tatsächlichen Änderungsstand des Datensatzes.
artikel.Save(o => o.ModifyLsn(erwarteteModifyLsn));
Sperren anfordern
artikel.Save(o =>
{
o.Locks.ForWritingSelf();
o.Locks.ForReading<Users>();
});
ForWriting<T>() und
ForReading<T>() beziehen sich auf den angegebenen
Datensatztyp, ForWritingSelf() auf den
geschriebenen Datensatz.
Zuweisungen beim Speichern
Assign überträgt Werte aus Adresse, Artikel oder Benutzer
in die angegebenen Felder.
var vorgang = qlApp.AddDataSet<Transactions>();
vorgang.Art = 70;
vorgang.AdrNr = "10000";
vorgang.Save(o =>
{
o.Assign.Address(v => v.AdrNr, "10000");
o.Assign.User(v => v.Bez, "Erstellt per API");
});
Bedingungen serverseitig prüfen
If prüft die Bedingung auf dem Server;
Raise bricht den Schreibvorgang mit einer
Meldung ab.
artikel.Save(o =>
{
o.If(a => a.SuchBeg == "Gesperrt", regel =>
regel.Raise("Dieser Artikel darf nicht geändert werden."));
});
Mit IfThenElse können Sie zusätzlich einen
zweiten Zweig angeben:
artikel.Save(o => o.IfThenElse(
a => a.Vk0Preis > 0,
dann => dann.Raise("Preis ist bereits gesetzt."),
sonst => sonst.Raise("Preis fehlt.")));