Partager via


Performances des DataViews

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, comme le filtrage et le tri, bénéficient d’une augmentation significative 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, consultez Filtrage avec DataView et Tri avec DataView.

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, consultez Recherche de lignes.

L'exemple suivant utilise la méthode Find pour rechercher un contact nommé « 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.
var found = view.Find("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")

L'exemple suivant utilise la méthode FindRows pour rechercher tous les produits de couleur rouge.

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

var criteria = new object[] { "Red" };

DataRowView[] foundRowsView = view.FindRows(criteria);
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)

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

Voir aussi