Condividi tramite


Prestazioni di DataView

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.

Find e FindRows

DataView costruisce un indice L'indice contiene chiavi costituite da una o più colonne della tabella o della vista. 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. È 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. 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. 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. Per altre informazioni sull'applicazione di filtri e sull'ordinamento con DataView, vedere Filtro con DataView e Ordinamento con 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. L'utilizzo della proprietà RowFilter è consigliato in applicazioni con associazioni a dati, in cui i risultati filtrati vengono visualizzati da un controllo associato. L'impostazione della proprietà RowFilter provoca una ricompilazione dell'indice dei dati, aggiungendo un sovraccarico all'applicazione e riducendo le prestazioni. I metodi Find e FindRows si avvalgono dell'indice corrente, senza che sia necessario ricompilarlo. Se si intende chiamare Find o FindRows solo una volta, è opportuno usare l'oggetto DataView esistente. 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. Per altre informazioni sui metodi Find e FindRows, vedere Ricerca di righe.

Nell'esempio seguente viene usato il metodo Find per individuare un contatto il cui cognome è "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")

Nell'esempio seguente viene usato il metodo FindRows per individuare tutti i prodotti di colore rosso.

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

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. La memorizzazione di questi tipi di risorse nella cache può migliorare in modo significativo le prestazioni dell'applicazione. Questo meccanismo viene implementato dalla classe Cache, con istanze cache private per ogni applicazione. 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.

Nell'esempio seguente l'oggetto DataView viene memorizzato nella cache per evitare di ordinare nuovamente i dati quando la pagina viene aggiornata.

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

Vedi anche