Prestazioni di DataViewDataView Performance

In questo argomento vengono illustrati i vantaggi, in termini di prestazioni, associati all'utilizzo dei metodi Find e FindRows della classe DataView e della memorizzazione nella cache di un oggetto DataView in un'applicazione Web.This topic discusses the performance benefits of using the Find and FindRows methods of the DataView class, and of caching a DataView in a Web application.

Find e FindRowsFind and FindRows

DataView costruisce un indiceDataView constructs an index. che contiene le chiavi compilate da una o più colonne della tabella o della vista.An index contains keys built from one or more columns in the table or view. Tali chiavi sono archiviate in una struttura che consente a DataView di individuare con rapidità ed efficienza la riga o le righe associate ai valori di chiave.These keys are stored in a structure that enables the DataView to find the row or rows associated with the key values quickly and efficiently. È quindi possibile notare un significativo incremento delle prestazioni nel caso di operazioni in cui viene usato l'indice, ad esempio l'ordinamento e il filtro.Operations that use the index, such as filtering and sorting, see signifcant performance increases. L'indice relativo a un oggetto DataView viene compilato sia quando si crea DataView che quando si modifica una qualsiasi delle informazioni relative all'ordinamento o al filtraggio.The index for a DataView is built both when the DataView is created and when any of the sorting or filtering information is modified. Se si crea un oggetto DataView e quindi si impostano le impostazioni sull'ordinamento o il filtraggio in un secondo momento, l'indice verrà compilato almeno due volte, ovvero una volta durante la creazione di DataView e una seconda volta quando viene modificata una qualsiasi delle proprietà di ordinamento o filtro.Creating a DataView and then setting the sorting or filtering information later causes the index to be built at least twice: once when the DataView is created, and again when any of the sort or filter properties are modified. Per ulteriori informazioni sul filtro e ordinamento con DataView, vedere filtro con DataView e ordinamento con DataView.For more information about filtering and sorting with DataView, see Filtering with DataView and Sorting with DataView.

Per restituire i risultati di una particolare query sui dati anziché fornire una visualizzazione dinamica di un subset di dati, è possibile usare i metodi Find o FindRows di DataView anziché impostare la proprietà RowFilter.If you want to return the results of a particular query on the data, as opposed to providing a dynamic view of a subset of the data, you can use the Find or FindRows methods of the DataView, rather than setting the RowFilter property. L'utilizzo della proprietà RowFilter è consigliato in applicazioni con associazioni a dati, in cui i risultati filtrati vengono visualizzati da un controllo associato.The RowFilter property is best used in a data-bound application where a bound control displays filtered results. L'impostazione della proprietà RowFilter provoca una ricompilazione dell'indice dei dati, aggiungendo un sovraccarico all'applicazione e riducendo le prestazioni.Setting the RowFilter property rebuilds the index for the data, adding overhead to your application and decreasing performance. I metodi Find e FindRows si avvalgono dell'indice corrente, senza che sia necessario ricompilarlo.The Find and FindRows methods use the current index without requiring the index to be rebuilt. Se si intende chiamare Find o FindRows solo una volta, è opportuno usare l'oggetto DataView esistente.If you are going to call Find or FindRows only once, then you should use the existing DataView. Se invece si intende chiamare Find o FindRows più volte, è opportuno creare un nuovo oggetto DataView per ricompilare l'indice sulla colonna da usare per la ricerca e quindi chiamare il metodo Find o FindRows.If you are going to call Find or FindRows multiple times, you should create a new DataView to rebuild the index on the column you want to search on, and then call the Find or FindRows methods. Per ulteriori informazioni sul Find e FindRows metodi, vedere ricerca righe.For more information about the Find and FindRows methods, see Finding Rows.

Nell'esempio seguente viene usato il metodo Find per individuare un contatto il cui cognome è "Zhu".The following example uses the Find method to find a contact with the last name "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");
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")

Nell'esempio seguente viene usato il metodo FindRows per individuare tutti i prodotti di colore rosso.The following example uses the FindRows method to find all the red colored products.

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);            
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.NETASP.NET

In ASP.NET è disponibile un meccanismo di memorizzazione nella cache, che consente di archiviare in memoria oggetti la cui creazione richiede una notevole quantità di risorse del server.ASP.NET has a caching mechanism that allows you to store objects that require extensive server resources to create in memory. La memorizzazione di questi tipi di risorse nella cache può migliorare in modo significativo le prestazioni dell'applicazione.Caching these types of resources can significantly improve the performance of your application. Questo meccanismo viene implementato dalla classe Cache, con istanze cache private per ogni applicazione.Caching is implemented by the Cache class, with cache instances that are private to each application. Poiché la creazione di un nuovo oggetto DataView può richiedere una notevole quantità di risorse, è opportuno usare la funzionalità di memorizzazione nella cache nelle applicazioni Web in modo da evitare di ricompilare DataView ogni volta che la pagina Web viene aggiornata.Because creating a new DataView object can be resource intensive, you might want to use this caching functionality in Web applications so that the DataView does not have to be rebuilt every time the Web page is refreshed.

Nell'esempio seguente l'oggetto DataView viene memorizzato nella cache per evitare di ordinare nuovamente i dati quando la pagina viene aggiornata.In the following example, the DataView is cached so that the data does not have to be re-sorted when the page is refreshed.

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

Vedere ancheSee Also

Data binding e LINQ to DataSetData Binding and LINQ to DataSet