Performances des DataView
Mise à jour : November 2007
Cette rubrique décrit les avantages en termes de performances de l'utilisation des méthodes Find et FindRows de la classe DataView, et de la mise en cache d'un DataView dans une application Web.
Find et FindRows
Le DataView construit un index. Il contient des clés créées à partir d'une ou plusieurs colonnes de la table ou de la vue. Ces clés sont stockées dans une structure qui permet au DataView de trouver rapidement et efficacement la ou les lignes associées aux valeurs de clé. Les opérations qui utilisent l'index, telles que le filtrage et le tri, bénéficient d'une augmentation considérable des performances. L'index d'un DataView est construit à la fois lors de la création du DataView et lorsque l'une des informations de tri ou de filtrage est modifiée. La création d'un DataView, suivie de la définition des informations de tri et de filtrage, entraîne la construction de l'index deux fois au moins : une fois lors de la création du DataView, puis à nouveau lorsqu'une des propriétés de tri ou de filtrage est modifiée. Pour plus d'informations sur le filtrage et le tri avec DataView, voir Filtrage avec DataView (LINQ to DataSet) et Tri avec DataView (LINQ to DataSet).
Si vous souhaitez retourner les résultats d'une requête particulière exécutée sur les données, vous pouvez, au lieu de fournir une vue dynamique d'un sous-ensemble des données, utiliser l'une des méthodes Find ou FindRows du DataView, plutôt que de définir la propriété RowFilter. L'utilisation de la propriété RowFilter est optimale dans une application de liaison de données où un contrôle lié affiche des résultats filtrés. Le paramétrage de la propriété RowFilter entraîne une nouvelle génération de l'index des données, ce qui accroît la charge sur votre application et, par voie de conséquence, fait baisser les performances. Les méthodes Find et FindRows utilisent l'index en cours sans qu'il soit nécessaire de le reconstruire. Si vous ne souhaitez appeler Find ou FindRows qu'une seule fois, il est préférable d'utiliser le DataView existant. Si vous souhaitez appeler Find ou FindRows plusieurs fois, vous devez créer un nouveau DataView pour reconstruire l'index sur la colonne où vous voulez effectuer la recherche, pour appeler la méthode Find ou FindRows. Pour plus d'informations sur les méthodes Find et FindRows, voir Recherche de lignes (ADO.NET).
L'exemple suivant utilise la méthode Find pour rechercher un contact nommé « Zhu ».
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");
L'exemple suivant utilise la méthode FindRows pour rechercher tous les produits de couleur rouge.
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 dispose d'un mécanisme de mise en cache qui vous permet de stocker en mémoire des objets dont la création mobilise beaucoup de ressources serveur. La mise en cache de ces types de ressources peut améliorer considérablement les performances de votre application. La mise en cache est implémentée par la classe Cache, avec les instances de cache spécifiques à chaque application. Parce que la création d'un nouvel objet DataView peut consommer beaucoup de ressources, il est préférable d'utiliser cette fonctionnalité de mise en cache dans les applications Web pour éviter d'avoir à reconstruire le DataView à chaque actualisation de la page Web.
Dans l'exemple suivant, le DataView est mis en cache pour éviter d'avoir à retrier les données à chaque actualisation de la page.
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();