Compartilhar via


Classificando com DataView (LINQ to DataSet)

A capacidade de classificar dados com base em critérios específicos e, em seguida, apresentar os dados a um cliente por meio de um controle de interface do usuário é um aspecto importante da associação de dados. DataView fornece várias maneiras de classificar dados e retornar linhas de dados ordenadas por critérios de ordenação específicos. Além de seus recursos de classificação baseados em cadeia de caracteres, DataView também permite que você use expressões LINQ (consulta Language-Integrated) para os critérios de classificaçã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 ambas as abordagens de classificação usando DataView.

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

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

A classificação baseada em expressão oferece classificação mais poderosa e complexa do que a classificação baseada em cadeia de caracteres mais simples. Observe que a classificação baseada em cadeia de caracteres e baseada em expressão é mutuamente exclusiva. Se a Sort baseada em cadeia de caracteres for definida após a criação de uma consulta DataView, o filtro baseado em expressão inferido da consulta será removido e não poderá ser redefinido.

O índice para um DataView é criado quando o DataView é criado e quando qualquer uma das informações de classificação ou filtragem é modificada. Você obtém o melhor desempenho fornecendo critérios de classificação na consulta LINQ to DataSet da qual o DataView é criado e sem modificar as informações de classificação posteriormente. Para obter mais informações, consulte o 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 nenhuma lógica que dependa de um número definido de execuções, pois as operações de classificação podem ser executadas várias vezes.

Exemplo

O exemplo a seguir consulta a tabela SalesOrderHeader e ordena as linhas retornadas até a data do pedido; cria um DataView a partir dessa consulta; e associa o DataView a um 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 a linha retornada pelo valor total devido; cria um DataView a partir dessa consulta; e associa o DataView a um 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 do pedido e, em seguida, pela ID do pedido de venda; cria um DataView a partir dessa consulta; e associa o DataView a um 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 strings de DataView ainda funciona com o LINQ para DataSet. Depois que um DataView tiver sido criado de uma consulta LINQ to DataSet, você poderá usar a Sort propriedade para definir a classificação no DataView.

A funcionalidade de classificação baseada em cadeia de caracteres e baseada em expressão é mutuamente exclusiva. Definir a Sort propriedade limpará a classificação baseada em expressão herdada da consulta da qual a DataView foi criada.

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

Exemplo

O exemplo a seguir cria um DataView a partir da tabela Contact e classifica as linhas primeiro 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 a tabela Contato em busca de sobrenomes que começam com a letra "S". Um DataView é criado a partir dessa consulta e associado a um BindingSource objeto.

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 DataView podem ser limpas depois de terem sido definidas usando a propriedade Sort. Há duas maneiras de limpar as informações de classificação em DataView:

  • Defina a propriedade Sort como null.

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

Exemplo

O exemplo a seguir cria um 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 DataView da tabela Contato e define a Sort propriedade para classificar por sobrenome em ordem decrescente. As informações de classificação são então limpadas ao definir 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

Consulte também