segunda-feira, 17 de janeiro de 2011

Linq: Join em Múltiplas Colunas

image

A consulta Linq que retorna as notas fiscais e respectivos itens é:

var resultado = 
(
from nf in contexto.NotasFiscais
join inf in contexto.ItensNotasFiscais
on new { campo1 = nf.CNPJ, campo2 = nf.Numero } equals { campo1 = inf.CNPJ, campo2 = inf.NumeroNF }
select new { nf.CNPJ, nf.Numero, inf.NumeroItem }
).ToList();


Você pode usar tipos anônimos para implementar a condição de ligação usando várias colunas. O pega é que se você usa tipos anônimos, as propriedades dos objetos dois lados do operador equals na cláusula join tem que ter o mesmo nome, ou será gerado um erro de compilação (The type of one of the expressions in the join clause is incorrect.  Type inference failed in the call to 'Join'). Faz sentido quando você pára pra pensar, mas não evita você ficar 2 horas olhando aquele join pensando o que está errado, até descobrir a causa…