Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Filtrar por Coluna de Objeto Incluido e Herdado

Eu quero filtrar por uma coluna de um objecto Incluido usando EF 6.

Então já entendi que tenho de usar:

var selecionados = contexto.Processos.Include(p => p.Clientes);

Clientes é uma IList genérica que tem Clientes PJ e PF.

E para selecionar pelo ID do Cliente posso usar:

selecionados = selecionados.Where(pc => pc.Clientes.Any(c => c.ClienteID == model.ClienteID));

Até aí tudo bem.

O problema é que a tabela de Clientes é uma tabela de Herança. Cliente é pai e ClientePF e ClientePJ são filhos. A principio Cliente é abstract, nem pode ser instanciado.

Como faço para fazer um filtro por um determinado CNPJ

seria algo assim:

selecionados = selecionados.Where(pc => pc.Clientes.Any(c => c.CNPJ == model.CNPJ));

Mas quando digito essa linha ele sublinha o c.CNPJ indicando que esse campo não existe. E realmente não existe no Pai, só em um dos filhos.

Esse campo c.CNPJ existe na entidade ClientePJ mas não aparece na entidade Cliente.

Então a clausula acima não é possível.

1 resposta
solução!

Olá Jaqueline,

O problema é justamente por você filtrar no contexto por Clientes, na variável selecionados ele terá tanto objetos do tipo ClientePF quanto ClientePJ. Então seria como se ele estivesse trabalhando com um IEnumerable<Cliente>. E como o Cliente não tem CNPJ ele não consegue fazer o Where do CNPJ.

O que você pode fazer é chamar a partir de selecionados o método do LINQ chamado OfType. Com ele você pode filtrar de selecionados apenas os objetos que são do tipo ClientePJ. Ai sim você poderá filtrar por CNPJ.