LINQ to Entity, Dicas…

Olá,  Umas das coisas que eu mais gosto de fazer na net é ficar tentando ajudar as pessoas do fórum MSDN a resolver seus pequenos e grandes problemas na tecnologia .Net principalmente no que tratá as tecnologias de acesso a dados utilizando LINQ to qualquer coisa. Tenho visto que por muitas vezes várias pessoas esbarram em erros parecidos. Por isto venho aqui com algumas dicas de utilização do LINQ para tentar ajudar a quem precisa.

Primeiro, vamos nos basear no modelo de entidades abaixo, mostrado na Figura 1:

Figura 1. Modelo de dados simples para vendas

1. Consulta de Dados Herdados

Um dos questionamentos que eu vejo se repetir muito é como fazer consulta a entidades que herdam de uma outra. Por exemplo como eu poderia retornar uma lista de Pessoas físicas  sem que junto viesse dados de pessoas jurídicas já que nosso EDMX não traz um propriedade especifica para cada uma, mas somente para a super classe ?

O meio de fazer isto é bastante simples, basta utilizar o comando OfType informando qual o tipo a ser retornado, segue exemplo na Listagem 1.

 

exampleEntities ex = new exampleEntities();
//Retornando somente dados de pessoa fisica
foreach (Pessoa p in ex.Pessoa.OfType())
{
      pRetorno = p;
}
//Tabém pode ser feito assim:
var query = from c in ex.Pessoa.OfType()
            orderby c.Data_Nascimento
            select c;
var pFisicaList = query.ToList();


Listagem 1.  Retornado dados de entidades herdadas

Também é possível fazer consulta em entidades que utilizem essas entidades herdadas como propriedades caso se deseje filtrar por um determinado tipo, por exemplo na listagem 2 vemos como fazer uma consulta para pegar todas as vendas que foram feitas por pessoas jurídicas


//retornando vendas de pessoas jurídica
 var queryVendas = from c in ex.Vendas
                   where ex.Pessoa.OfType().Contains(c.Pessoa)
                   select c;
var queryVendasList = queryVendas.ToList();


Listagem 2.  Filtrando dados de propriedades herdadas

2. Deletando dados de entidades relacionadas

No fórum do LINQ, umas das questões mais recorrentes é relacionadas a deleção de dados que estão relacionados por exemplo se eu tentar executar o código da Listagem 3 para excluir um cliente da base que tiver vendas cadastradas será mostrado um erro em tempo de execução, informando que não é possível deletar pois existem houve um conflito referente a alguma constraint.


Pessoa pessoaParaDeletar = ex.Pessoa.Single(c => c.Id.Equals(4));
                           ex.Pessoa.DeleteObject(pessoaParaDeletar);
                           ex.SaveChanges();
/*ERRO:An error occurred while updating the entries. See the inner exception for details.*/
 /*INNER EXCEPTION: The DELETE statement conflicted with the REFERENCE constraint "FK_PessoaVendas".
 * The conflict occurred in database "example", table "dbo.Vendas", column 'Pessoa_Id'.
 * The statement has been terminated.*/


Listagem 3.  Deleção não bem sucedida com Linq to Entities e dados relacionados

Para realizar a deleção com sucesso destes dados é necessário:
2.1. modificar o edmx que contem o mapeamento, alterando o relacionamento entre as entidades (clicando em cima da linha entre as entidades e apertando F4) mudando a propriedade END1 onDelete ou End2 onDelete(depende do lado que está o relacionamento, mas é aquele ao qual contem a entidade que será deletada em conjunto)  para Cascade, conforme a figura 2

Figura 2. Propriedade OnDelete p/ cascade

Com isto estamos informando que ao deletar um dado da entidade pessoa, os dados relacionados na entidade vendas também serão deletados.

2.2. Para finalizar, temos de informar na nossa consulta que os dados de vendas também precisam ser deletados, para isto basta usarmos o include na consulta passando como parâmetro o nome da entidade que se relaciona, segue exemplo do código na Listagem 4


Pessoa pessoaParaDeletar = ex.Pessoa.Include("Vendas").Single(c => c.Id.Equals(4));
                           ex.Pessoa.DeleteObject(pessoaParaDeletar);
                           ex.SaveChanges();


Listagem 4.  Deleção não bem sucedida com Linq to Entities e dados relacionados

Por enquanto é só isto.

🙂

Anúncios
Esse post foi publicado em LINQ e marcado . Guardar link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s