Zeilen mithilfe von QueryExpression sortieren
Um die Sortierreihenfolge für die Zeilen in Tabellen festzulegen, verwenden Sie die Eigenschaften QueryExpression.Orders oder LinkEntity.Orders.
Hinweis
Die Orders
-Eigenschaft ist schreibgeschützt. Sie können OrderExpression-Instanzen mithilfe der Objektinitialisierung oder durch Verwendung der QueryExpression.AddOrder-Methode auf diese Sammlung festlegen.
LinkEntity
hat keine AddOrder
-Methode. Sie können System.Collections.ObjectModel.Collection<T>-Methoden verwenden, welche die Orders
-Eigenschaft erbt.
Die Standardsortierreihenfolge ist OrderType.Ascending
.
Die folgende Abfrage gibt Konto-Datensätze in aufsteigender Reihenfolge nach createdon
-, name
- und accountnumber
-Werten zurück.
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
Orders = {
{
new OrderExpression(
attributeName: "createdon",
orderType: OrderType.Ascending)
},
{
new OrderExpression(
attributeName: "name",
orderType: OrderType.Ascending)
},
{
new OrderExpression(
attributeName: "accountnumber",
orderType: OrderType.Ascending)
},
}
};
Dieselbe Abfrage kann mit der QueryExpression.AddOrder-Methode erstellt werden:
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "accountnumber", "createdon")
};
query.AddOrder(attributeName: "createdon", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "name", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "accountnumber", orderType: OrderType.Ascending);
Die Reihenfolge der Elemente bestimmt, wie die Reihenfolge angewendet wird. Um die Sortierung mit accountnumber
anzuwenden, fügen Sie zuerst diese Reihenfolge hinzu:
query.AddOrder(attributeName: "accountnumber", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "createdon", orderType: OrderType.Ascending);
query.AddOrder(attributeName: "name", orderType: OrderType.Ascending);
Absteigende Reihenfolge
Wenn Sie die absteigende Reihenfolge verwenden möchten, verwenden Sie OrderType.Descending
. Das folgende Beispiel gibt Kontodatensätze zurück, wobei die zuletzt erstellten Datensätze oben stehen.
var query = new QueryExpression(entityName: "account") {
ColumnSet = new ColumnSet("name", "createdon")
};
query.AddOrder(attributeName: "createdon", orderType: OrderType.Descending);
LinkEntity-Sortierungen zuerst verarbeiten
Dataverse sortiert die durch LinkEntity.Orders angegebenen Spalten immer nach QueryExpression.Orders.
Das folgende Beispiel zeigt ein herkömmliches Sortiermuster für die Spalten LinkEntity
und QueryExpression
.
var query = new QueryExpression(entityName: "account")
{
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
LinkEntities = {
new LinkEntity(
linkFromEntityName:"account",
linkToEntityName:"account",
linkFromAttributeName: "parentaccountid",
linkToAttributeName:"accountid",
joinOperator: JoinOperator.Inner){
EntityAlias = "parentaccount",
Columns = new ColumnSet("name"),
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending)
}
}
}
},
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending)
}
}
};
In diesem Fall werden die Ergebnisse nach folgenden Attributen geordnet:
- Erster =>
account.name
- Letzter =>
parentaccountname.name
Um sicherzustellen, dass die LinkEntity
-Reihenfolge zuerst angewendet wird, verschieben Sie OrderExpression
von LinkEntity.Orders
nach QueryExpression.Orders
über der anderen OrderExpression
und verwenden Sie den OrderExpression.EntityName, um auf den LinkEntity.EntityAlias-Wert zu verweisen.
var query = new QueryExpression(entityName: "account")
{
ColumnSet = new ColumnSet("name", "accountnumber", "createdon"),
LinkEntities = {
new LinkEntity(
linkFromEntityName:"account",
linkToEntityName:"account",
linkFromAttributeName: "parentaccountid",
linkToAttributeName:"accountid",
joinOperator: JoinOperator.Inner){
EntityAlias = "parentaccount",
Columns = new ColumnSet("name")
}
},
Orders = {
{
new OrderExpression(
attributeName:"name",
orderType: OrderType.Ascending){
// LinkEntity.EntityAlias value
EntityName = "parentaccount"
}
},
{
new OrderExpression(
// QueryExpression Columns name
attributeName:"name",
orderType: OrderType.Ascending)
}
}
};
Jetzt werden die Ergebnisse nach den folgenden Attributen geordnet:
- Erster =>
parentaccount.name
- Letzter =>
account.name
Such- und Auswahlspalten ordnen
Die in den meisten Spaltentypen enthaltenen Daten sind relativ einfach und Sie können sinnvolle Sortiervorgänge durchführen. Such- und Auswahlspalten sind komplexer, da die in der Datenbank gespeicherten Daten außerhalb des Kontexts keine Bedeutung haben.
Suchspalten
Wenn Sie mithilfe von Suchspalten ordnen, werden die Ergebnisse anhand des primären Namensfelds für die zugehörige Tabelle sortiert. Die Datenbank speichert einen GUID-Wert. Der zurückgegebene formatierte Wert ist das entsprechende Feld des primären Namens.
Auswahlspalten
Auch die Werte der Auswahlspalte werden nach dem formatierten Wert sortiert, statt nach den in der Datenbank gespeicherten Werten. Daten für diese Spalten werden als Ganzzahlen gespeichert. Der formatierte Wert ist eine lokalisierte Bezeichnung basierend auf der Sprache des Benutzenden.
Hinweis
Da die Auswahlsortierung auf der lokalisierten Bezeichnung der Sprache des Benutzenden basiert, erwarten Sie eine unterschiedliche Reihenfolge der Ergebnismenge, wenn die Sprache des Benutzenden abweicht.
Anordnung und Auslagerung
Die Reihenfolge einer Seite macht beim Auslagern von Daten einen großen Unterschied. Wenn die Informationen zur Reihenfolge der Ergebnisse nicht eindeutig sind, kann Dataverse ausgelagerte Daten nicht konsistent oder effizient zurückgeben.
Geben Sie eine Reihenfolge für Ihre Abfrage an. Wenn Sie bei FetchXml Ihrer Abfrage keine Sortierelemente hinzufügen, fügt Dataverse eine Sortierung basierend auf dem Primärschlüssel der Tabelle hinzu. Dies ist bei QueryExpression jedoch nicht der Fall. Wenn Ihre Abfrage distinct
-Ergebnisse angibt, werden außerdem keine Primärschlüsselwerte zurückgegeben, weshalb Dataverse diese Standardreihenfolge nicht hinzufügen kann. Sie müssen eine Auslagerungsreihenfolge angeben. Ohne Angabe einer Reihenfolge werden distinct
-Abfrageergebnisse möglicherweise in zufälliger Reihenfolge zurückgegeben. OData bietet keine Option zum Zurückgeben unterschiedlicher Ergebnisse. Sie sollten beim Abrufen ausgelagerter Ergebnisse jedoch trotzdem eine Reihenfolge anwenden.
Die Auslagerung ist dynamisch. Jede Anforderung wird bei Eingang einzeln bewertet. Ein Auslagerungs-Cookie teilt Dataverse die vorherige Seite mit. Mit diesen Auslagerungs-Cookie-Daten kann Dataverse mit dem nächsten Datensatz nach dem letzten auf der vorherigen Seite beginnen.
Die Auslagerung funktioniert zukünftig am besten. Wenn Sie zurückgehen und eine Seite abrufen, die Sie zuvor abgerufen haben, können die Ergebnisse unterschiedlich sein, da seit dem letzten Abruf der Seite Datensätze hinzugefügt, gelöscht oder geändert werden konnten. Mit anderen Worten: Wenn Ihre Seitengröße 50 beträgt und Sie zurückgehen, erhalten Sie 50 Datensätze, es handelt sich jedoch möglicherweise nicht um dieselben 50 Datensätze. Wenn Sie die Seiten eines Dataset weiter durchgehen, können Sie davon ausgehen, dass alle Datensätze in einer konsistenten Reihenfolge zurückgegeben werden.
Die deterministische Sortierung ist wichtig
Deterministische Reihenfolge bedeutet, dass es eine Möglichkeit gibt, eine Reihenfolge konsistent zu berechnen. Bei einem bestimmten Datensatzsatz werden die Datensätze immer in derselben Reihenfolge zurückgegeben. Wenn Sie eine einheitliche Reihenfolge und ein Paging benötigen, müssen Sie einige eindeutige Werte oder Kombinationen aus Spaltenwerten einschließen und eine Reihenfolge angeben, in der sie ausgewertet werden sollen.
Nichtdeterministisches Beispiel
Schauen wir uns ein Beispiel an, das nichtdeterministisch ist. Dieses Dataset enthält nur Status und Status-Informationen und ist gefiltert, um nur Datensätze in einem offenen Status zurückzugeben. Die Ergebnisse sind nach Status geordnet. Die ersten drei Seiten werden angefordert. Die Ergebnisse sehen folgendermaßen aus:
Bundesstaat | Status | Seite |
---|---|---|
Eröffnung | Aktiv | 1 Start |
Eröffnung | Aktiv | 1 |
Eröffnung | Aktiv | 1 Ende |
Eröffnung | Aktiv | |
Eröffnung | Aktiv | |
Eröffnung | Inaktiv | |
Eröffnung | Inaktiv |
Das Auslagerungs-Cookie speichert Informationen über den letzten Datensatz auf der Seite. Wenn die nächste Seite angefordert wird, ist der letzte Datensatz der ersten Seite nicht enthalten. Aufgrund der nichtdeterministischen Daten gibt es jedoch keine Garantie dafür, dass die beiden anderen Datensätze auf der ersten Seite nicht auf der zweiten Seite enthalten sind.
Um eine deterministische Reihenfolge zu erreichen, fügen Sie Reihenfolgen für Spalten hinzu, die eindeutige oder halbeindeutige Werte enthalten.
Deterministisches Beispiel
Diese Abfrage ähnelt der nichtdeterministischen Abfrage, enthält jedoch die Spalte Fall-ID, die eindeutige Werte enthält. Es wird auch nach Status, aber auch nach Fall-ID sortiert. Die Ergebnisse sehen folgendermaßen aus:
Bundesstaat | Status | Fall-ID | Seite |
---|---|---|---|
Eröffnung | Aktiv | Case-0010 | 1 Start |
Eröffnung | Aktiv | Case-0021 | 1 |
Eröffnung | Aktiv | Case-0032 | 1 Ende |
Eröffnung | Aktiv | Case-0034 | |
Eröffnung | Aktiv | Case-0070 | |
Eröffnung | Inaktiv | Case-0015 | |
Eröffnung | Inaktiv | Case-0047 |
Auf der nächsten Seite hat das Cookie Case-0032
als letzten Datensatz auf der ersten Seite gespeichert, sodass Seite zwei mit dem nächsten Datensatz nach diesem Datensatz startet. Die Ergebnisse sehen folgendermaßen aus:
Bundesstaat | Status | Fall-ID | Seite |
---|---|---|---|
Eröffnung | Aktiv | Case-0010 | 1 Start |
Eröffnung | Aktiv | Case-0021 | 1 |
Eröffnung | Aktiv | Case-0032 | 1 Ende |
Eröffnung | Aktiv | Case-0034 | 2 Start |
Eröffnung | Aktiv | Case-0070 | 2 |
Eröffnung | Inaktiv | Case-0015 | 2 Ende |
Eröffnung | Inaktiv | Case-0047 |
Da diese Abfrage eindeutige Spaltenwerte anordnet, ist die Reihenfolge konsistent.
Best Practices für Reihenfolgen beim Auslagern von Daten
Hinweis
Wenn möglich, sollten Abfragen nach dem Primärschlüssel für die Tabelle sortiert werden, da Dataverse standardmäßig für die Sortierung nach dem Primärschlüssel optimiert ist. Die Sortierung nach nicht eindeutigen oder komplexen Feldern führt zu übermäßigem Overhead und langsameren Abfragen.
Wenn Sie einen begrenzten Satz von Daten zur Anzeige in einer Anwendung abrufen oder mehr als 5.000 Datenzeilen zurückgeben müssen, müssen Sie die Ergebnisse auslagern. Die Auswahl, die Sie bei der Bestimmung der Reihenfolge der Ergebnisse treffen, kann bestimmen, ob sich die Zeilen auf jeder von Ihnen abgerufenen Datenseite mit anderen Seiten überschneiden. Ohne die richtige Reihenfolge kann derselbe Datensatz auf mehr als einer Seite erscheinen.
Um zu verhindern, dass derselbe Datensatz auf mehr als einer Seite erscheint, wenden Sie die folgenden Best Practices an:
Am besten fügen Sie eine Spalte mit einem eindeutigen Bezeichner ein. Zum Beispiel:
- Spalten für Primärschlüssel der Tabellen
- AutoWert-Spalten
- Benutzer-/Kontakt-IDs
Wenn Sie keine Spalte mit einem eindeutigen Bezeichner einschließen können, schließen Sie mehrere Felder ein, die höchstwahrscheinlich zu eindeutigen Kombinationen führen. Zum Beispiel:
- Vorname + Nachname + E-Mail-Adresse
- Vollständiger Name + E-Mail-Adresse
- E-Mail-Adresse + Firmenname
Anti-Muster für Reihenfolgen beim Auslagern von Daten
Die folgenden Auswahlmöglichkeiten für die Sortierung sollten Sie vermeiden:
Sortierungen ohne eindeutige Bezeichner
Sortierungen in berechneten Feldern
Sortierungen mit einzelnen oder mehreren Feldern, die wahrscheinlich keine Eindeutigkeit bieten, wie:
- Status und Zustand
- Auswahlmöglichkeiten oder Ja/Nein
- Namenswerte allein. Zum Beispiel
name
,firstname
,lastname
- Textfelder wie Titel, Beschreibungen und mehrzeiliger Text
- Nicht eindeutige Nummernfelder
Nächste Schritte,
Erfahren Sie, wie Zeilen gefiltert werden.