Compartilhar via


Criando um objeto DataView (LINQ to DataSet)

Há duas maneiras de criar um DataView no contexto LINQ to DataSet. Você pode criar um DataView de uma consulta LINQ to DataSet sobre DataTable, ou você pode criá-lo de um DataTable tipado ou não tipado. Em ambos os casos, você cria o DataView usando um dos métodos de extensão de AsDataView; DataView não pode ser construído diretamente no contexto LINQ to DataSet.

Depois que o DataView for criado, você pode associá-lo a um controle de interface do usuário em um aplicativo de formulários do Windows ou em um aplicativo ASP.NET, ou alterar as configurações de filtragem e classificação.

DataView constrói um índice, que aumenta significativamente o desempenho de operações que podem usar o índice, como filtragem e classificação. O índice para um DataView é criado quando o DataView é criado e quando qualquer uma das informações de classificação ou filtragem é modificada. Criar um DataView e, em seguida, definir as informações de classificação ou filtragem posteriormente faz com que o índice seja criado pelo menos duas vezes: uma vez quando o DataView é criado e novamente quando qualquer uma das propriedades de classificação ou filtro é modificada.

Para obter mais informações sobre filtragem e classificação com DataView, consulte Filtragem com DataView e Classificação com DataView.

Criando um DataView de uma consulta LINQ to DataSet

Um DataView objeto pode ser criado a partir dos resultados de uma consulta LINQ to DataSet, em que os resultados são uma projeção de DataRow objetos. O recém-criado DataView herda as informações de filtragem e classificação da consulta da qual ela é criada.

Observação

Na maioria dos casos, as expressões usadas para filtragem e 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 e filtragem podem ser executadas várias vezes.

A criação de uma DataView a partir de uma consulta que retorna tipos anônimos ou de consultas que executam operações de junção não é suportada.

Somente os seguintes operadores de consulta têm suporte em uma consulta usada para criar DataView:

Observe que quando um DataView é criado de uma consulta LINQ to DataSet, o Select método deve ser o método final chamado na consulta. Isso é mostrado no exemplo a seguir, que cria uma lista DataView de pedidos online ordenados pelo valor total devido:

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

Você também pode usar as propriedades baseadas em cadeia de caracteres RowFilter e Sort para filtrar e classificar um DataView após ele ter sido criado a partir de uma consulta. Observe que isso limpará as informações de classificação e filtragem herdadas da consulta. O exemplo a seguir cria DataView de uma consulta de LINQ to DataSet que filtra pelos sobrenomes que começam com “S”. A propriedade baseada em Sort cadeia de caracteres é definida para classificar os sobrenomes em ordem crescente e, em seguida, os primeiros nomes em ordem decrescente:

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"

Criando um DataView de um DataTable

Além de ser criado a partir de uma consulta LINQ to DataSet, um DataView objeto pode ser criado a partir de um DataTable usando o AsDataView método.

O exemplo a seguir cria um DataView relacionado à tabela SalesOrderDetail e o define como a fonte de dados de um BindingSource objeto. Esse objeto atua como um proxy para um DataGridView controle.

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

A filtragem e classificação podem ser definidas no DataView após serem criadas a partir de um DataTable. O exemplo a seguir cria um DataView da tabela Contato e define a Sort propriedade para classificar os sobrenomes em ordem crescente e, em seguida, os primeiros nomes em ordem decrescente:

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 entanto, há uma perda de desempenho que ocorre ao configurar a propriedade RowFilter ou Sort após a criação da DataView a partir de uma consulta, porque DataView constrói um índice para dar suporte a operações de filtragem e classificação. Definindo a propriedade de RowFilter ou de Sort reconstrói o índice para os dados, adicionando a sobrecarga ao seu aplicativo e a diminuir o desempenho. Quando possível, é melhor especificar as informações de filtragem e classificação ao criar DataView pela primeira vez e evitar modificá-las posteriormente.

Consulte também