Compartir a través de


Crear un objeto DataView (LINQ to DataSet)

Existen dos maneras de crear DataView en el contexto de LINQ to DataSet. Se puede crear DataView a partir de una consulta de LINQ to DataSet en DataTable o a partir de DataTable con o sin tipo. En ambos casos, se crea DataView utilizando uno de los métodos de extensión AsDataView; DataView no se puede construir directamente en el contexto de LINQ to DataSet.

Cuando se ha creado DataView, puede enlazarlo con un control de la interfaz de usuario en una aplicación de Windows Forms o en una aplicación ASP.NET, o cambiar la configuración de filtro y ordenación.

DataView construye un índice, que mejora considerablemente el rendimiento de las operaciones que pueden utilizarlo, como filtro y ordenación. 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.

Crear DataView desde una consulta LINQ to DataSet

Un objeto DataView puede crearse a partir de los resultados de una consulta LINQ to DataSet, en la que los resultados son una proyección de objetos DataRow. El objeto DataView que se acaba de crear hereda la información de filtrado y ordenación de la consulta a partir de la cual se creó.

Nota

En la mayor parte de los casos, las expresiones utilizadas en el filtrado y la ordenación no deben tener efectos secundarios y deben ser deterministas. Además, las expresiones no deben tener ninguna lógica que dependa de un número de conjunto de ejecuciones, ya que las operaciones de filtrado y ordenación se pueden ejecutar un número ilimitado de veces.

No se admite la creación de DataView a partir de una consulta que devuelve tipos anónimos o consultas que realizan operaciones de combinación.

Sólo se admiten los siguientes operadores de consulta en una consulta utilizada para crear DataView:

Tenga en cuenta que, cuando se crea un objeto DataView a partir de una consulta de LINQ to DataSet, el método Select deber ser el método final que se invoca en la consulta. Esto se muestra en el ejemplo siguiente, en el que se crea un objeto DataView de pedidos en línea ordenados por el total a pagar:

DataTable orders = _dataSet.Tables["SalesOrderHeader"];

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
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()
bindingSource1.DataSource = view

También se pueden utilizar las propiedades basadas en cadena RowFilter y Sort para filtrar y ordenar DataView después de haber sido creado a partir de una consulta. Observe que con esto se borrará la información de ordenación y filtro heredada de la consulta. El ejemplo siguiente crea DataView a partir de una consulta de LINQ to DataSet que filtra por apellidos que empiezan por "S". La propiedad basada en cadena Sort se establece para ordenar por apellidos en orden ascendente y después por nombres en orden descendente:

DataTable contacts = _dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Crear DataView a partir de DataTable

Además de poderse crear a partir de una consulta de LINQ to DataSet, un objeto DataView se puede crear a partir de DataTable utilizando el método AsDataView.

En el ejemplo siguiente, se crea DataView a partir de la tabla SalesOrderDetail y se establece ese objeto como origen de datos de un objeto BindingSource: Este objeto actúa como proxy para un control DataGridView.

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

El filtro y la ordenación pueden establecerse en DataView después de que se haya creado a partir de DataTable. El ejemplo siguiente crea DataView a partir de la tabla Contact y establece la propiedad Sort para ordenar por apellidos en orden ascendente y luego por nombres en orden descendente:

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc, FirstName asc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

No obstante, se produce una pérdida de rendimiento cuando se establece la propiedad RowFilter o Sort después de haberse creado DataView a partir de una consulta, debido a que DataView construye un índice para admitir operaciones de filtro y ordenación. El establecimiento de la propiedad RowFilter o Sort hace que se recompile el índice de los datos, lo que agrega sobrecarga a la aplicación y reduce el rendimiento. Siempre que sea posible, se recomienda especificar la información sobre filtro y ordenación cuando se cree por primera vez DataView y evitar modificaciones posteriores.

Consulte también