Sortieren mit DataView (LINQ to DataSet)

Die Möglichkeit, Daten nach bestimmten Kriterien zu sortieren und dann über ein UI-Steuerelement für einen Client bereitzustellen, ist ein wichtiger Aspekt der Datenbindung. DataView bietet mehrere Möglichkeiten, Daten zu sortieren und nach bestimmten Sortierkriterien geordnete Datenzeilen zurückzugeben. Zusätzlich zu den Zeichenfolgenbasierten Sortierfunktionen DataView können Sie auch LINQ-Ausdrücke (Language-Integrated Query) für die Sortierkriterien verwenden. LINQ-Ausdrücke ermöglichen viel komplexere und leistungsfähigere Sortiervorgänge als Zeichenfolgenbasierte Sortierung. In diesem Thema werden beide Ansätze für die Sortierung mit DataView beschrieben.

Erstellen einer "DataView" auf der Grundlage einer Abfrage mit Sortierinformationen

Ein DataView Objekt kann aus einer LINQ to DataSet-Abfrage erstellt werden. Wenn diese Abfrage eine OrderBy-, eine OrderByDescending-, eine ThenBy-, oder eine ThenByDescending-Klausel enthält, werden die Ausdrücke in diesen Klauseln als Basis für die Sortierung der Daten in der DataView verwendet. Wenn die Abfrage z. B. die Klauseln Order By… und Then By… enthält, würden die Daten in der resultierenden DataView nach beiden angegebenen Spalten geordnet werden.

Die ausdrucksbasierte Sortierung bietet leistungsfähigere und komplexere Sortierfunktionen als die einfachere zeichenfolgenbasierten Sortierung. Beachten Sie, dass sich die zeichenfolgenbasierte und die ausdrucksbasierte Sortierung gegenseitig ausschließen. Wenn mit Sort die zeichenfolgenbasierte Sortierung festgelegt wird, nachdem eine DataView auf der Grundlage einer Abfrage erstellt wurde, wird der ausdrucksbasierte Filter gelöscht, der aus der Abfrage abgeleitet wurde. Er kann dann nicht wiederhergestellt werden.

Der Index für eine DataView wird sowohl dann generiert, wenn die DataView erstellt wird, als auch dann, wenn Änderungen an den Sortier- oder Filterinformationen vorgenommen werden. Zur Vermeidung von Einbußen bei der Arbeitsgeschwindigkeit empfiehlt es sich, die Sortierkriterien bereits in der LINQ to DataSet-Abfrage anzugeben, auf deren Grundlage die DataView erstellt wird, und diese Sortierinformationen später nicht mehr zu ändern. Weitere Informationen finden Sie unter DataView Leistung.

Hinweis

In den meisten Fällen dürften die für die Sortierung verwendeten Ausdrücke keine Nebenwirkungen haben. Sie müssen deterministisch sein. Die Ausdrücke dürfen darüber hinaus keine Logik enthalten, die auf einer festgelegten Anzahl von Ausführungen beruht, da die Sortieroperationen unbegrenzt oft ausgeführt werden können sollen.

Beispiel

Im folgenden Beispiel wird die SalesOrderHeader-Tabelle abgefragt, und die zurückgegebenen Zeilen werden nach dem Auftragsdatum sortiert. Danach wird auf der Grundlage dieser Abfrage eine erstellt. Die wird anschließend an eine gebunden.

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of DateTime)("OrderDate") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Beispiel

Im folgenden Beispiel wird die SalesOrderHeader-Tabelle abgefragt, und die zurückgegebene Zeile wird nach dem fälligen Gesamtbetrag sortiert. Danach wird auf der Grundlage dieser Abfrage eine erstellt. Diese wird anschließend an eine gebunden.

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Beispiel

Im folgenden Beispiel wird die <legacyBold>SalesOrderDetail</legacyBold>-Tabelle abgefragt, und die zurückgegebenen Zeilen werden nach Bestellmenge und dann nach Auftrags-ID sortiert. Danach wird auf der Grundlage dieser Abfrage eine DataView erstellt. Diese DataView wird anschließend an eine BindingSource gebunden.

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Verwenden der Eigenschaft für die zeichenfolgenbasierte Sortierung

Die DataView-Funktion zur zeichenfolgenbasierten Sortierung funktioniert auch mit LINQ to DataSet noch. Nachdem auf der Grundlage einer LINQ to DataSet-Abfrage eine DataView erstellt wurde, können Sie die Sort-Eigenschaft verwenden, um die Sortierung für die DataView festzulegen.

Die zeichenfolgenbasierte und die ausdrucksbasierte Sortierung schließen sich gegenseitig aus. Durch die Einrichtung der Sort-Eigenschaft wird die ausdrucksbasierte Sortierung gelöscht, die von der Abfrage geerbt wurde, auf der die DataView basiert.

Weitere Informationen zur Zeichenfolgenbasierten Sort Filterung finden Sie unter Sortieren und Filtern von Daten.

Beispiel

Im folgenden Beispiel wird auf der Grundlage der <legacyBold>Contact</legacyBold>-Tabelle eine DataView erstellt. Anschließend werden die Zeilen nach dem Nachnamen in absteigender und dann nach dem Vornamen in aufsteigender Richtung sortiert:

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc, FirstName asc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Beispiel

Das folgende Beispiel fragt die Contact-Tabelle nach Nachnamen ab, die mit dem Buchstaben "S" beginnen. Auf der Grundlage dieser Abfrage wird eine DataView erstellt und an ein BindingSource-Objekt gebunden.

DataTable contacts = _dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Löschen der Sortierinformationen

Die Sortierinformationen für eine DataView können mit der Sort-Eigenschaft gelöscht werden. Es gibt zwei Möglichkeiten, die Sortierinformationen in DataView zu löschen:

  • Setzen Sie die Sort-Eigenschaft auf null.

  • indem für die Sort-Eigenschaft eine leere Zeichenfolge festgelegt wird

Beispiel

Im folgenden Beispiel wird eine DataView auf der Grundlage einer Abfrage erstellt, und die Sortierinformationen werden gelöscht, indem für die Sort-Eigenschaft eine leere Zeichenfolge festgelegt wird:

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<decimal>("TotalDue")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "";
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = ""

Beispiel

Im folgenden Beispiel wird eine auf der Grundlage der Contact-Tabelle erstellt und dann die -Eigenschaft so eingerichtet, dass die Ergebnisse in absteigender Reihenfolge nach dem Nachnamen sortiert werden. Anschließend werden die Sortierinformationen gelöscht, indem die Sort-Eigenschaft auf null gesetzt wird:

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

'Clear the sort.
view.Sort = Nothing

Weitere Informationen