Partilhar via


Desempenho do DataView

Este tópico discute os benefícios de desempenho do uso dos métodos Find e FindRows da classe DataView e do armazenamento em cache de um DataView numa aplicação web.

Localizar e Localizar Linhas

DataView constrói um índice. Um índice contém chaves criadas a partir de uma ou mais colunas na tabela ou exibição. Essas chaves são armazenadas em uma estrutura que permite localizar a DataView linha ou linhas associadas aos valores de chave de forma rápida e eficiente. As operações que usam o índice, como filtragem e classificação, obtêm aumentos significativos de desempenho. O índice para a DataView é criado quando o DataView é criado e quando qualquer informação de classificação ou filtragem é modificada. Criar um DataView e, em seguida, definir as informações de classificação ou filtragem posteriormente faz com que o índice seja criado pelo menos duas vezes: uma vez quando o DataView é criado e novamente quando qualquer uma das propriedades de classificação ou filtro são modificadas. Para obter mais informações sobre filtragem e classificação com DataView, consulte Filtrando com DataView e Classificando com DataView.

Se quiser retornar os resultados de uma consulta específica nos dados, em vez de fornecer uma exibição dinâmica de um subconjunto dos dados, pode-se usar os métodos Find ou FindRows do DataView, em vez de definir a propriedade RowFilter. A RowFilter propriedade é melhor usada em um aplicativo ligado a dados onde um controle acoplado exibe resultados filtrados. A definição da RowFilter propriedade recria o índice dos dados, adicionando sobrecarga ao seu aplicativo e diminuindo o desempenho. Os Find métodos e FindRows usam o índice atual sem exigir que o índice seja reconstruído. Se estiveres a ligar Find ou FindRows apenas uma vez, então deves usar o existente DataView. Se for chamar Find ou FindRows várias vezes, deverá criar um novo DataView para reconstruir o índice na coluna que deseja pesquisar e, em seguida, chamar os métodos Find ou FindRows. Para obter mais informações sobre os métodos Find e FindRows, consulte Localizar Linhas.

O exemplo a seguir usa o Find método para encontrar um contato com o sobrenome "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")

O exemplo a seguir usa o FindRows método para localizar todos os produtos de cor vermelha.

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 tem um mecanismo de cache que permite armazenar objetos que exigem recursos extensivos do servidor para serem criados na memória. O armazenamento em cache desses tipos de recursos pode melhorar significativamente o desempenho do seu aplicativo. O cache é implementado pela Cache classe, com instâncias de cache que são privadas para cada aplicativo. Como a criação de um novo DataView objeto pode exigir muitos recursos, convém usar essa funcionalidade de cache em aplicativos Web para que o DataView não precise ser reconstruído sempre que a página da Web for atualizada.

No exemplo a seguir, o DataView é armazenado em cache para que os dados não precisem ser reclassificados quando a página for atualizada.

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

Ver também