Compartilhar via


Classificando com DataView (LINQ to DataSet)

A capacidade de classificar dados com base em critérios específicos e apresentá-los para um cliente através de um controle da interface do usuário é um aspecto importante da vinculação de dados. O objeto DataView fornece várias maneiras de classificar dados e retornar linhas de dados ordenadas por critérios específicos. Além de suas capacidades de ordenação baseadas em strings, o DataView também permite utilizar expressões LINQ (consulta integrada à linguagem) para os critérios de ordenação. As expressões LINQ permitem operações de classificação muito mais complexas e poderosas do que a classificação baseada em cadeia de caracteres. Este tópico descreve as duas abordagens de classificação usando DataView.

Criando um DataView a partir de uma consulta com informações de classificação

Um objeto DataView pode ser criado a partir de uma consulta LINQ to DataSet. Se a consulta contiver uma cláusula OrderBy, OrderByDescending, ThenBy ou ThenByDescending, as expressões nessas cláusulas serão usadas como base para classificar os dados no objeto DataView. Por exemplo, se a consulta contiver as cláusulas Order By…e Then By…, o DataView resultante ordenaria os dados pelas duas colunas especificadas.

A classificação baseada em expressão oferece uma classificação mais avançada e complexa do que a classificação mais simples baseada em cadeia de caracteres. Observe que a classificação baseada em cadeia de caracteres e a classificação baseada em expressão são mutuamente excludentes. Se a Sort baseada em cadeia de caracteres for definida após DataView ser criado a partir de uma consulta, o filtro baseado em expressão inferido da consulta será limpo e não poderá ser redefinido.

O índice de um DataView é compilado quando DataView é criado e quando qualquer informação de classificação ou de filtragem é modificada. Você obtém melhor desempenho fornecendo critérios de classificação na consulta LINQ to DataSet da qual DataView é criado e não modificando informações de classificação posteriormente. Para obter mais informações, consulte Desempenho do DataView.

Observação

Na maioria dos casos, as expressões usadas para classificação não devem ter efeitos colaterais e devem ser determinísticas. Além disso, as expressões não devem conter lógica que dependa de um número definido de execuções, pois as operações de classificação podem ser executadas qualquer número de vezes.

Exemplo

O exemplo a seguir consulta a tabela SalesOrderHeader e ordena as linhas retornadas pela ordem do pedido; cria DataView a partir da consulta e associa o objeto DataView a uma BindingSource.

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<DateTime>("OrderDate")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of DateTime)("OrderDate") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Exemplo

O exemplo a seguir consulta a tabela SalesOrderHeader e ordena as linhas retornadas pelo valor total devido; cria DataView a partir da consulta e associa o objeto DataView a uma BindingSource.

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    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() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Exemplo

O exemplo a seguir consulta a tabela SalesOrderDetail e ordena as linhas retornadas pela quantidade de pedidos e depois pela ID da ordem de venda; cria DataView a partir da consulta e associa o objeto DataView a uma BindingSource.

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

EnumerableRowCollection<DataRow> query = from order in orders.AsEnumerable()
                                         orderby order.Field<short>("OrderQty"), order.Field<int>("SalesOrderID")
                                         select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

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

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Int16)("OrderQty"), order.Field(Of Integer)("SalesOrderID") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Usando a propriedade de classificação baseada em cadeia de caracteres

A funcionalidade de classificação baseada em cadeia de caracteres do objeto DataView ainda funciona com o LINQ to DataSet. Depois que um DataView é criado a partir de uma consulta LINQ to DataSet, você pode usar a propriedade Sort para definir a classificação no DataView.

As funcionalidades de classificação baseada em cadeia de caracteres e de classificação baseada em expressão são mutuamente excludentes. A definição da propriedade Sort limpa a classificação baseada em expressão herdada da consulta a partir da qual o objeto DataView foi criado.

Para obter mais informações sobre filtragem baseada em filtro Sort de cadeia de caracteres, consulte Classificação e Filtragem de Dados.

Exemplo

O exemplo a seguir cria um DataView a partir da tabela de contatos e classifica as linhas por sobrenome em ordem decrescente e depois por nome em ordem crescente:

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

Exemplo

O exemplo a seguir consulta na tabela de contatos os sobrenomes que começam com a letra "S". Um DataView é criado a partir dessa consulta e associado a um objeto BindingSource.

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"

Limpando a classificação

As informações de classificação em um objeto DataView podem ser limpas depois de definidas usando a propriedade Sort. Existem duas maneiras de limpar informações de classificação no objeto DataView:

  • Defina a propriedade Sort como null.

  • Defina a propriedade Sort como uma cadeia de caracteres vazia.

Exemplo

O exemplo a seguir cria um objeto DataView a partir de uma consulta e limpa a classificação definindo a propriedade Sort como uma cadeia de caracteres vazia:

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

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

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "";
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = ""

Exemplo

O exemplo a seguir cria um objeto DataView a partir da tabela de contatos e define a propriedade Sort a ser classificada por sobrenome em ordem decrescente. As informações de classificação serão limpas definindo a propriedade Sort como null:

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

DataView view = contacts.AsDataView();

view.Sort = "LastName desc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();

// Clear the sort.
view.Sort = null;
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()
view.Sort = "LastName desc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

'Clear the sort.
view.Sort = Nothing

Confira também