Criando um objeto de DataView (LINQ to DataSet)
Há duas maneiras de criar um DataView no contexto de 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 DataView usando um dos métodos de extensão de AsDataView; DataView não é construtível diretamente no contexto de LINQ to DataSet.
Após DataView foi criado, você pode associá-lo a um controle de interface do usuário em um aplicativo de formulários do Windows ou um aplicativo ASP.NET, ou alterar as configurações de filtro e classificação.
DataView constrói um índice, que aumenta significativamente o desempenho das operações que podem usar o índice, como filtragem e classificação. O índice de um DataView é compilado quando DataView é criado e quando qualquer informação de classificação ou de filtragem é modificada. Criar DataView e então defina a classificação ou informações de filtragem causam posteriormente o índice a ser compilado pelo menos duas vezes: uma vez que quando DataView é criado, e novamente quando algumas de tipo ou propriedades de filtragem são alteradas.
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 objeto de DataView pode ser criado de resultados de uma consulta de LINQ to DataSet, onde os resultados sejam uma projeção de objetos DataRow. DataView recém-criado herda informações de filtro e classificação de consulta que é criada de.
Observação
Na maioria dos casos, as expressões usadas filtrar e classificar não devem ter efeitos colaterais e devem ser determinísticas. Além disso, as expressões não devem conter qualquer lógica que dependam um número definido de executa, como as operações de classificação e filtragem podem ser executadas qualquer número de vezes.
Criando DataView de uma consulta que retorna os tipos anônimos ou consultas que executam join a operações não são suportados.
Somente os seguintes operadores de consulta são suportados em uma consulta utilizada para criar DataView:
Observe que quando um DataView é criado de uma consulta LINQ to DataSet, o método Select deve ser o método final chamado na consulta. Isso é mostrado no exemplo a seguir, que cria um DataView dos pedidos online classificados pelo 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 DataView depois que foi criado de uma consulta. Observe que isso desmarcará classificação e informações de filtragem herdadas de 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 cadeia de caracteres- base de Sort é definida para classificar em sobrenomes na ordem crescente e em 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 da criação de uma consulta de LINQ to DataSet, um objeto DataView pode ser criado de DataTable usando o método AsDataView.
O exemplo a seguir cria DataView da tabela de SalesOrderDetail e defina-o como a fonte de dados de um objeto de BindingSource . Este objeto atua como um proxy para um controle de 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()
A filtragem e a classificação podem ser definidas em DataView depois que foi criado de DataTable. O exemplo a seguir cria DataView da tabela de contatos e defina a propriedade de Sort para classificar em sobrenomes na ordem crescente e em 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 proveniente com definir a propriedade de RowFilter ou de Sort após DataView foi criado de uma consulta, como DataView constrói um índice para oferecer suporte a operações de filtro 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 informações de filtro e classificação quando você primeiro cria DataView e impede o alterar mais tarde.