Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O LINQ to SQL oferece suporte à associação a controles comuns, como controles de grade. Especificamente, o LINQ to SQL define os padrões básicos para vinculação a uma grade de dados e manipulação da vinculação mestre-detalhe, tanto no que diz respeito à exibição quanto à atualização.
Princípio subjacente
LINQ to SQL traduz consultas LINQ para SQL para execução em um banco de dados. Os resultados têm tipagem forte IEnumerable. Como esses objetos são objetos CLR (Common Language Runtime) comuns, a vinculação de dados de objetos comuns pode ser usada para exibir os resultados. Por outro lado, as operações de alteração (inserções, atualizações e exclusões) exigem etapas adicionais.
Funcionamento
A vinculação implícita aos controles do Windows Forms é realizada implementando IListSource. As fontes de dados genéricas Table<TEntity> (Table<T> em C# ou Table(Of T) em Visual Basic) e DataQuery foram atualizadas para implementar IListSource. Os mecanismos de vinculação de dados da interface do usuário (UI) (Windows Forms e Windows Presentation Foundation) testam se a fonte de dados implementa IListSource. Portanto, escrever uma afetação direta de uma consulta a uma fonte de dados de um controle chama implicitamente a criação de uma coleção utilizando LINQ to SQL, como no exemplo a seguir:
DataGrid dataGrid1 = new DataGrid();
DataGrid dataGrid2 = new DataGrid();
DataGrid dataGrid3 = new DataGrid();
var custQuery =
from cust in db.Customers
select cust;
dataGrid1.DataSource = custQuery;
dataGrid2.DataSource = custQuery;
dataGrid2.DataMember = "Orders";
BindingSource bs = new BindingSource();
bs.DataSource = custQuery;
dataGrid3.DataSource = bs;
Dim dataGrid1 As New DataGrid()
Dim dataGrid2 As New DataGrid()
Dim dataGrid3 As New DataGrid()
Dim custQuery = _
From cust In db.Customers _
Select cust
dataGrid1.DataSource = custQuery
dataGrid2.DataSource = custQuery
dataGrid2.DataMember = "Orders"
Dim bs = _
New BindingSource()
bs.DataSource = custQuery
dataGrid3.DataSource = bs
O mesmo ocorre com o Windows Presentation Foundation:
ListView listView1 = new ListView();
var custQuery2 =
from cust in db.Customers
select cust;
ListViewItem ItemsSource = new ListViewItem();
ItemsSource = (ListViewItem)custQuery2;
Dim listView1 As New ListView()
Dim custQuery2 = _
From cust In db.Customers _
Select cust
Dim ItemsSource As New ListViewItem
ItemsSource = custQuery2
As gerações de coleção são implementadas pelos genéricos Table<TEntity> e DataQuery em GetList.
Implementação IListSource
O LINQ to SQL implementa IListSource em dois locais:
A fonte de dados é um Table<TEntity>: LINQ to SQL navega na tabela para preencher uma coleção
DataBindingListque mantém uma referência da tabela.A fonte de dados é um IQueryable<T>. Existem dois cenários:
Se o LINQ to SQL encontrar o subjacente Table<TEntity> do IQueryable<T>, a fonte permitirá a edição e a situação será a mesma do primeiro ponto.
Se o LINQ to SQL não conseguir encontrar o subjacente Table<TEntity>, a fonte não permitirá a edição (por exemplo,
groupby). LINQ to SQL navega na consulta para preencher um genéricoSortableBindingList, que é um simples BindingList<T> que implementa o recurso de classificação para entidades T para uma determinada propriedade.
Coleções Especializadas
Para várias funcionalidades descritas anteriormente neste documento, BindingList<T> foi especializado para diferentes classes. Estas classes são genéricas SortableBindingList e genéricas DataBindingList. Ambos são declarados como internos.
Lista Genérica OrdenávelBinding
Esta classe herda de BindingList<T>, e é uma versão classificável do BindingList<T>. A classificação é uma solução na memória e nunca entra em contato com o banco de dados em si.
BindingList<T> implementa IBindingList, mas não suporta ordenar automaticamente. No entanto, BindingList<T> implementa IBindingList com métodos de núcleo virtual. Você pode facilmente substituir esses métodos. Substituições genéricas sobressaem SortableBindingList, SupportsSortingCore, SortPropertyCore, SortDirectionCore e ApplySortCore.
ApplySortCore é chamado por ApplySort e classifica a lista de itens T para uma determinada propriedade.
Uma exceção é levantada se o imóvel não pertencer a T.
Para obter a classificação, o LINQ to SQL cria uma classe genérica SortableBindingList.PropertyComparer que herda do genérico IComparer.Compare e implementa um comparador padrão para um determinado tipo T, a PropertyDescriptore uma direção. Esta classe cria dinamicamente um Comparer de T onde T é o PropertyType do PropertyDescriptor. Em seguida, o comparador padrão é recuperado do genérico Comparerestático . Uma instância padrão é obtida usando reflexão.
Generic SortableBindingList também é a classe base para DataBindingList. O Generic SortableBindingList oferece dois métodos virtuais para suspender ou retomar o rastreamento de adição/remoção de itens. Esses dois métodos podem ser usados para recursos básicos, como classificação, mas realmente serão implementados por classes superiores, como genéricos DataBindingList.
Lista de Ligação de Dados Genérica
Esta classe herda do genérico SortableBindingLIst. Generic DataBindingList mantém uma referência sobre o genérico Table subjacente do genérico IQueryable usado para o enchimento inicial da coleção. Generic DatabindingList adiciona rastreamento para adicionar/remover itens à coleção ao substituir InsertItem() e RemoveItem(). Ele também implementa a funcionalidade abstrata de suspensão/retomada de rastreamento para tornar o rastreamento condicional. Essa funcionalidade permite que o recurso genérico DataBindingList tire pleno proveito do uso polimórfico da funcionalidade de rastreamento das classes parentais.
Vinculação a EntitySets
A vinculação a EntitySet é um caso especial porque EntitySet já é uma coleção que implementa IBindingList. O LINQ to SQL adiciona suporte a ordenação e cancelamento (ICancelAddNew). Uma EntitySet classe usa uma lista interna para armazenar entidades. Esta lista é uma coleção de baixo nível baseada em uma matriz genérica, a classe genérica ItemList .
Adicionando um recurso de classificação
As matrizes oferecem um método de ordenação (Array.Sort()) que pode ser usado com um Comparer de T. LINQ to SQL utiliza a classe genérica SortableBindingList.PropertyComparer descrita anteriormente neste tópico para obter esta Comparer para a propriedade e a direção a ordenar. Um ApplySort método é adicionado ao genérico ItemList para chamar esse recurso.
Do lado EntitySet, agora é necessário declarar o suporte à ordenação:
SupportsSorting retorna
true.ApplySort chama
entities.ApplySort()e depoisOnListChanged().SortDirection e SortProperty as propriedades expõem a definição de classificação atual, que é armazenada em membros locais.
Quando usa um System.Windows.Forms.BindingSource e vincula um EntitySet<TEntity> ao System.Windows.Forms.BindingSource.DataSource, deve chamar EntitySet<TEntity>.GetNewBindingList para atualizar BindingSource.List.
Se você usar um System.Windows.Forms.BindingSource e definir a propriedade BindingSource.DataMember e definir BindingSource.DataSource para uma classe que tenha uma propriedade nomeada no BindingSource.DataMember que expõe a TEntity EntitySet<, não será necessário chamar EntitySet>TEntity<>. GetNewBindingList para atualizar o BindingSource.List, mas você perde a capacidade de classificação.
Armazenamento em cache
As consultas LINQ to SQL implementam GetList. Quando a classe BindingSource do Windows Forms atende a essa interface, ela chama GetList() três vezes para uma única conexão. Para contornar essa situação, o LINQ to SQL implementa um cache por instância para armazenar e sempre retornar a mesma coleção gerada.
Cancelamento
IBindingList Define um AddNew método que é usado por controles para criar um novo item de uma coleção acoplada. O DataGridView controle mostra esse recurso muito bem quando a última linha visível contém uma estrela em seu cabeçalho. A estrela mostra que você pode adicionar um novo item.
Além desse recurso, uma coleção também pode implementar ICancelAddNew. Esse recurso permite que os controles cancelem ou validem se o novo item editado foi validado ou não.
ICancelAddNew é implementado em todas as coleções vinculadas a dados LINQ to SQL (genéricas SortableBindingList e genéricas EntitySet). Em ambas as implementações, o código executa da seguinte maneira:
Permite que os itens sejam inseridos e, em seguida, removidos da coleção.
Não controla as alterações, desde que a interface do usuário não confirme a edição.
Não controla alterações enquanto a edição estiver cancelada (CancelNew).
Permite acompanhar quando a edição é efetuada (EndNew).
Permite que a coleção se comporte normalmente se o novo item não vier de AddNew.
Solução de problemas
Esta seção destaca vários itens que podem ajudar a solucionar problemas de seus aplicativos de vinculação de dados LINQ to SQL.
Você deve usar propriedades; utilizar apenas campos não é suficiente. Os Windows Forms exigem esse uso.
Por padrão, os tipos de banco de dados
image,varbinaryetimestampsão mapeados para um array de bytes. ComoToString()não há suporte nesse cenário, esses objetos não podem ser exibidos.Um membro de classe mapeado para uma chave primária tem um setter, mas o LINQ to SQL não oferece suporte à alteração de identidade do objeto. Portanto, a chave primária/exclusiva usada no mapeamento não pode ser atualizada no banco de dados. Uma alteração na grelha causa uma exceção quando se chama SubmitChanges.
Se uma entidade estiver vinculada em duas grades separadas (por exemplo, uma mestre e outro detalhe), uma
Deletena grade mestra não será propagada para a grade de detalhes.