Freigeben über


Erstellen eines 'DataView'-Objekts (LINQ to DataSet)

Es gibt zwei Möglichkeiten, im LINQ to DataSet-Kontext eine DataView zu erstellen. Sie können das DataView-Objekt auf der Grundlage einer LINQ to DataSet-Abfrage einer DataTable erstellen, oder Sie können es auf der Grundlage einer typisierten oder nicht typisierten DataTable erstellen. In beiden Fällen erstellen Sie die DataView mithilfe einer der AsDataView-Erweiterungsmethoden. Im LINQ to DataSet-Kontext ist es nicht möglich, DataView-Objekte direkt und ohne Grundlage 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 DataView finden Sie unter Filtern mit 'DataView' (LINQ to DataSet) und Sortieren mit 'DataView' (LINQ to DataSet).

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.

HinweisHinweis

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 eine DataView aus einer LINQ to DataSet-Abfrage erstellt wird, muss die Select<TRow, S>-Methode die in der Abfrage zuletzt aufgerufene Methode sein. Dies wird im folgenden Beispiel verdeutlicht, bei dem eine DataView von Onlinebestellungen erstellt wird, die nach Gesamtbetrag sortiert sind:

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
DataTable orders = dataSet.Tables["SalesOrderHeader"];

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

Sie können auch die zeichenfolgenbasierten Eigenschaften RowFilter und Sort verwenden, um die Einträge in einer DataView zu filtern und zu sortieren, die auf der Grundlage einer Abfrage erstellt wurde. Beachten Sie, dass dabei die von der Abfrage geerbten Sortierungs- und Filterinformationen gelöscht werden. Im folgenden Beispiel wird eine DataView auf der Grundlage einer LINQ to DataSet-Abfrage erstellt, bei der nur die Einträge angezeigt werden, bei denen der Nachname mit "S" beginnt. Die zeichenfolgenbasierte Sort-Eigenschaft ist so eingerichtet, dass die Nachnamen in aufsteigender Reihenfolge und dann die Vornamen in absteigender Reihenfolge sortiert werden:

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"
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";

Erstellen einer "DataView" aus einer "DataTable"

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

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

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

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable orders = dataSet.Tables["SalesOrderDetail"];

DataView view = 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 DataView auf der Grundlage der Contact-Tabelle erstellt und dann die Sort-Eigenschaft so eingerichtet, dass die Nachnamen in aufsteigender und dann die Vornamen in absteigender Reihenfolge sortiert werden:

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

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

DataView view = contacts.AsDataView();

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

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

Wenn die DataView auf der Grundlage einer Abfrage erstellt wurde, kommt es jedoch beim Einrichten der Eigenschaft RowFilter bzw. Sort 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.

Siehe auch

Konzepte

Datenbindung und LINQ to DataSet

Filtern mit 'DataView' (LINQ to DataSet)

Sortieren mit 'DataView' (LINQ to DataSet)