Rendimiento de DataView
En este tema se abordan las ventajas del uso de los métodos Find y FindRows de la clase DataView, y del almacenamiento en memoria caché de DataView en una aplicación web.
Find y FindRows
DataView construye un índice. Un índice contiene claves generadas a partir de una o varias columnas de la tabla o la vista. Dichas claves están almacenadas en una estructura que permite que DataView busque de forma rápida y eficiente la fila o filas asociadas a los valores de cada clave. Las operaciones que utilizan el índice, como las de filtro y ordenación, ven aumentar significativamente el rendimiento. El índice de DataView se compila cuando se crea DataView y cuando se modifica cualquier información de filtro u ordenación. La creación de DataView y el posterior establecimiento de información de filtro y ordenación hace que el índice se compile al menos dos veces: una cuando se crea DataView y la otra cuando se modifica cualquiera de las propiedades de ordenación y filtrado. Para obtener más información sobre el filtrado y la ordenación con DataView, vea Filtrar con DataView y Ordenar con DataView.
Si desea devolver los resultados de una consulta determinada en los datos, en lugar de proporcionar una vista dinámica de un subconjunto de los datos, para conseguir el máximo rendimiento puede utilizar los métodos Find o FindRows de la DataView, en lugar de establecer la propiedad RowFilter. La propiedad RowFilter es más idónea en una aplicación enlazada a datos donde un control enlazado muestra resultados filtrados. El establecimiento de la propiedad RowFilter hace que se recompile el índice de los datos, lo que agrega sobrecarga a la aplicación y reduce el rendimiento. Los métodos Find y FindRows utilizan el índice actual, sin necesidad de recompilarlo. Si va a llamar a Find o a FindRows una única vez, entonces debería utilizar el DataView existente. Si va a llamar a Find o a FindRows varias veces, debería crear un nuevo DataView para recompilar el índice en la columna en la que desea buscar y, a continuación, llamar a los métodos Find o FindRows. Para obtener más información acerca de los métodos Find y FindRows vea Buscar filas.
El ejemplo siguiente utiliza el método Find para buscar un contacto con el apellido "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")
En el ejemplo siguiente se usa el método FindRows para buscar todos los productos de color rojo.
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 dispone de un mecanismo de almacenamiento en memoria caché de objetos cuya creación en memoria requiere una gran cantidad de recursos del servidor. Si se almacenan estos tipos de recursos en la memoria caché se puede mejorar de forma significativa el rendimiento de la aplicación. La clase Cache implementa el almacenamiento en memoria caché, con instancias de la memoria caché privadas para cada aplicación. Dado que la creación de un objeto DataView nuevo puede consumir muchos recursos, quizás desee utilizar esta funcionalidad de almacenamiento en caché en aplicaciones web para que DataView no tenga que recompilarse cada vez que se actualiza la página web.
En el ejemplo siguiente, DataView se almacena en caché para que los datos no tengan que volver a ordenarse cuando la página se actualice.
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();