Dica
ADO.NET Cuidado com a direção do predicado

Digamos que temos uma Cliente e ClienteSeguro. A empresa tem vários tipos de cliente, ClienteSeguro é um deles. Veja essa query:


var result= (from c in ctx.ClienteSeguro
where c.Cliente.Name=="Joao"
select c).FirstOrDefault();


Parece uma query simples, certo?

Mas estamos falando de um relacionamento 1-1. Vamos colocar uma complexidade a mais: Digamos que na tabela ClienteSeguro implementamos uma herança e a tabela contém instâncias de 2 classes diferentes, com um campo discriminator.

Está pronto o desastre, mas você, desenvolvedor, não vai ver.

Para ver esse desastre, precisa utilizar o intellitrace ou o SQL Server Profiler para identificar a instrução SQL gerada pelo entity.

É simples: O que deveria ser um simples relacionamento entre duas tabelas vira 3 relacionamentos, o entity repete uma das tabelas duas vezes na query, prejudicando a performance da query.

Certamente é um bug, não encontrei nenhuma documentação na web. Mas existe um pequeno hack para evita-lo:

var result= (from c in ctx.Cliente
where c.Name=="Joao"
select c.ClienteSeguro).FirstOrDefault();

Simplesmente invertendo a query o problema se resolve e temos uma query SQL bem montada.

Não é um problema muito comum, ocorre em um relacionamento 1-1 onde um dos lados usa herança e TPH, porém isso chama atenção para o fato que devemos sempre observar as queries geradas pelo entity e ter certeza que tudo está correndo bem.

Búfalo Informática
e-mail: Contato@bufaloinfo.com.br
Telefones: (21) 99240-7281 (21) 99240-5134