Erstellen eines DataView-Objekts (LINQ to DataSet)

Es gibt zwei Möglichkeiten, im LINQ to DataSet-Kontext ein DataView-Objekt zu erstellen. Sie können ein DataView-Objekt über eine LINQ to DataSet-Abfrage für eineDataTable oder aus einer typisierten oder nicht typisierten DataTable erstellen. In beiden Fällen erstellen Sie das DataView-Objekt mithilfe einer der AsDataView-Erweiterungsmethoden. Im LINQ to DataSet-Kontext ist es nicht möglich, ein DataView-Objekt direkt zu konstruieren.

Nachdem die DataView erstellt wurde, können Sie sie an ein Benutzeroberflächensteuerelement in einer Windows Forms-Anwendung oder einer ASP.NET-Anwendung binden oder die Filter- und Sortiereinstellungen ändern.

DataView erstellt einen Index, der bei Operationen, die diesen Index einsetzen können, wie beim Filtern und Sortieren, zu beträchtlichen Leistungssteigerungen führt. 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. Wenn Sie eine DataView erstellen, ohne gleich auch die Sortier- und Filterinformationen festzulegen, wird der Index mindestens zweimal generiert: das erste Mal, wenn die DataView erstellt wird, und das zweite Mal, sobald eine der Sortier- oder Filtereigenschaften geändert wird.

Weitere Informationen zum Filtern und Sortieren mit DataViewfinden Sie unter Filtern mit DataView und Sortieren mit DataView.

Erstellen einer "DataView" auf der Grundlage einer LINQ to DataSet-Abfrage

Ein DataView-Objekt kann auf der Grundlage der Ergebnisse einer LINQ to DataSet-Abfrage erstellt werden, wobei es sich bei den Ergebnissen um eine Projektion von DataRow-Objekten handelt. Die neu erstellte DataView erbt die Filter- und Sortierinformationen von der Abfrage, auf deren Grundlage sie erstellt wurde.

Hinweis

In den meisten Fällen haben die für die Filterung und Sortierung verwendeten Ausdrücke keine Nebenwirkungen. 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 Sortier- und Filteroperationen unbegrenzt oft ausgeführt werden können sollen.

Das Erstellen einer DataView auf der Grundlage einer Abfrage, die anonyme Typen oder Abfragen zurückgibt, die ihrerseits Joins ausführen, wird nicht unterstützt.

In einer Abfrage, die die Grundlage für eine DataView bilden soll, werden nur die folgenden Abfrageoperatoren unterstützt:

Wenn ein DataView-Objekt aus einer LINQ to DataSet-Abfrage erstellt wird, muss die Select-Methode die in der Abfrage zuletzt aufgerufene Methode sein. Dies wird im folgenden Beispiel verdeutlicht, bei dem ein DataView-Objekt von Onlinebestellungen erstellt wird, die nach Gesamtfälligkeit sortiert sind:

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    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() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

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

Sie können auch die zeichenfolgenbasierten Eigenschaften RowFilter und Sort verwenden, um ein DataView-Objekt zu filtern und zu sortieren, nachdem es aus einer Abfrage erstellt wurde. Beachten Sie, dass dabei die von der Abfrage geerbten Sortierungs- und Filterinformationen gelöscht werden. Im folgenden Beispiel wird ein DataView-Objekt aus einer LINQ to DataSet-Abfrage erstellt, die nach Nachnamen, die mit „S“ beginnen, filtert. Die zeichenfolgenbasierte Sort-Eigenschaft ist so eingerichtet, dass die Nachnamen in aufsteigender Reihenfolge und dann die Vornamen in absteigender Reihenfolge sortiert werden:

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"

Erstellen einer "DataView" aus einer "DataTable"

Ein DataView-Objekt kann nicht nur aus einer LINQ to DataSet-Abfrage erstellt werden, sondern auch aus einer DataTable, wobei die AsDataView-Methode zum Einsatz kommt.

Im folgenden Beispiel wird eine DataView auf der Grundlage der <legacyBold>SalesOrderDetail</legacyBold>-Tabelle erstellt und dann als Datenquelle eines BindingSource-Objekts festgelegt. Dieses Objekt fungiert als Proxy für ein DataGridView-Steuerelement.

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

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

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

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Nachdem die DataView auf der Grundlage einer DataTable erstellt wurde, können Filter- und Sortiereigenschaften für sie festgelegt werden. Im folgenden Beispiel wird eine auf der Grundlage der Contact-Tabelle erstellt und dann die -Eigenschaft so eingerichtet, dass die Nachnamen in aufsteigender und dann die Vornamen in absteigender Reihenfolge sortiert werden:

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()

Wenn die RowFilter auf der Grundlage einer Abfrage erstellt wurde, kommt es jedoch beim Einrichten der Eigenschaft Sort bzw. DataView zu einem Leistungsabfall, weil DataView einen Index generiert, um die Filter- und Sortieroperationen zu unterstützen. Wenn Sie die Eigenschaft RowFilter oder Sort festlegen, wird der Index für die Daten neu erstellt, wodurch zusätzlicher Verwaltungsmehraufwand für die Anwendung entsteht und die Arbeitsgeschwindigkeit verringert wird. Es ist daher empfehlenswert, die Filter- und Sortierinformationen schon beim Erstellen der DataView einzurichten und nachträgliche Änderungen zu vermeiden.

Weitere Informationen