'DataView'-Arbeitsgeschwindigkeit
Aktualisiert: November 2007
In diesem Thema wird beschrieben, wie sich die Verwendung der Methoden Find und FindRows der DataView-Klasse und die Zwischenspeicherung einer DataView in einer Webanwendung positiv auf die Arbeitsgeschwindigkeit auswirken können.
"Find" und "FindRows"
DataView generiert einen Index. Ein Index enthält Schlüssel, die auf der Grundlage einer oder mehrerer Spalten in der Tabelle oder Ansicht erstellt werden. Diese Schlüssel werden in einer Struktur gespeichert, mit der die DataView schnell und effizient die Zeile(n) finden kann, die mit den Schlüsselwerten verknüpft sind. Für Operationen, die den Index verwenden, wie die Filterung und Sortierung, ergeben sich signifikante Leistungssteigerungen. 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).
Wenn Sie die Ergebnisse einer bestimmten Abfrage von Daten zurückgeben möchten, anstatt eine dynamische Ansicht einer Teilmenge von Daten zu erhalten, können Sie die Methode Find oder FindRows der DataView verwenden, statt die RowFilter-Eigenschaft einzurichten. Die RowFilter-Eigenschaft wird am besten in einer datengebundenen Anwendung verwendet, in der ein gebundenes Steuerelement gefilterte Ergebnisse anzeigt. Wenn Sie die RowFilter-Eigenschaft festlegen, wird der Index für die Daten neu erstellt, wodurch zusätzlicher Verwaltungsaufwand für die Anwendung entsteht und die Arbeitsgeschwindigkeit verringert wird. Die Methoden Find und FindRows nutzen den aktuellen Index, ohne dass der Index neu erstellt werden muss. Wenn Sie Find oder FindRows nur einmal aufrufen werden, sollten Sie die vorhandene DataView verwenden. Wird Find oder FindRows dagegen mehrmals aufgerufen, empfiehlt sich die Erstellung einer neuen DataView, um den Index auf der Basis der zu durchsuchenden Spalte neu zu erstellen, und dann die Methode Find oder FindRows aufzurufen. Weitere Informationen über die Methoden Find und FindRows finden Sie unter Suchen nach Zeilen (ADO.NET).
Im folgenden Beispiel wird die Find-Methode verwendet, um einen Kontakt mit dem Nachnamen "Zhu" zu finden.
Dim contacts As DataTable = dataSet.Tables("Contact")
Dim query = _
From contact In contacts.AsEnumerable() _
Order By contact.Field(Of String)("LastName") _
Select contact
Dim view As DataView = query.AsDataView()
Dim found As Integer = view.Find("Zhu")
DataTable contacts = dataSet.Tables["Contact"];
EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
orderby contact.Field<string>("LastName")
select contact;
DataView view = query.AsDataView();
// Find a contact with the last name of Zhu.
int found = view.Find("Zhu");
Im folgenden Beispiel wird die FindRows-Methode verwendet, um alle Produkte mit roter Farbe abzurufen.
Dim products As DataTable = dataSet.Tables("Product")
Dim query = _
From product In products.AsEnumerable() _
Order By product.Field(Of Decimal)("ListPrice"), product.Field(Of String)("Color") _
Select product
Dim view As DataView = query.AsDataView()
view.Sort = "Color"
Dim criteria As Object() = New Object() {"Red"}
Dim foundRowsView As DataRowView() = view.FindRows(criteria)
DataTable products = dataSet.Tables["Product"];
EnumerableRowCollection<DataRow> query = from product in products.AsEnumerable()
orderby product.Field<Decimal>("ListPrice"), product.Field<string>("Color")
select product;
DataView view = query.AsDataView();
view.Sort = "Color";
object[] criteria = new object[] { "Red"};
DataRowView[] foundRowsView = view.FindRows(criteria);
ASP.NET
ASP.NET verfügt über einen Cachemechanismus zur Zwischenspeicherung von Objekten, die die Serverressourcen in starkem Maße beanspruchen. Durch die Zwischenspeicherung dieser Ressourcen kann die Geschwindigkeit Ihrer Anwendung wesentlich verbessert werden. Die Zwischenspeicherung wird von der Klasse Cache implementiert. Die dabei zum Einsatz kommenden Cacheinstanzen sind jeweils anwendungsspezifisch und privat. Da das Erstellen eines neuen DataView-Objekts die Ressourcen stark beanspruchen kann, kann mit der Zwischenspeicherfunktionalität in Webanwendungen verhindert werden, dass die DataView bei jeder Aktualisierung der Webseite neu erstellt werden muss.
Im folgenden Beispiel wird die DataView im Cache zwischengespeichert. So wird dafür gesorgt, dass die Daten nicht neu sortiert werden müssen, wenn die Seite aktualisiert wird.
If (Cache("ordersView") = Nothing) Then
Dim dataSet As New DataSet()
FillDataSet(dataSet)
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()
Cache.Insert("ordersView", view)
End If
Dim ordersView = CType(Cache("ordersView"), DataView)
GridView1.DataSource = ordersView
GridView1.DataBind()
if (Cache["ordersView"] == null)
{
// Fill the DataSet.
DataSet dataSet = FillDataSet();
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();
Cache.Insert("ordersView", view);
}
DataView ordersView = (DataView)Cache["ordersView"];
GridView1.DataSource = ordersView;
GridView1.DataBind();