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 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 formularios Windows 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 (LINQ to DataSet) y Ordenar con DataView (LINQ to DataSet).

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ó.

NotaNota

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.

Solo 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 LINQ to DataSet, el método Select<TRow, S> 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:

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

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 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:

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"
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";

Crear DataView a partir de DataTable

Además de poderse crear a partir de una consulta 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.

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

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()
DataTable orders = dataSet.Tables["SalesOrderDetail"];

DataView view = 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:

Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

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

DataView view = 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 vuelva a crear 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.

Vea también

Conceptos

Enlace de datos y LINQ to DataSet

Filtrar con DataView (LINQ to DataSet)

Ordenar con DataView (LINQ to DataSet)