3
respostas

Usando include em busca com herança

Professor, tenho a seguinte camada de negocio:

public abstract class Contato
{
    public int Id {get; set;}
   public string Descricao {get; set;} 
     public List<Telefone> Telefones{get;set;}
}
public class Unidade : Contato
{
    public TipoUnidade Tipo{get; set;}
}
public class Funcionario: Contato
{
    public Setor setor{get; set;}
}

O padrão de mapeamento que estou usando é o TPH.

Como posso dar include nas associações, preferencialmente, com apenas uma busca no banco? Tentei dessa maneira, sem sucesso:

        public List<Contato> GetContatos()
        {
            return  this._contexto.Contatos
                .Include(te=>te.Telefones)
                .Include(ti=>ti.Tipo)
                .Include(s => s.setor)
                .OrderBy(a => a.Descricao).ToList();
        }

Com a tentativa abaixo também tive erro:

public List<Contato> GetContatos()
        {
            List<Contato> contatos= this._contexto.Contatos
                .Include(u=>(u as Unidade).Tipo)
                .ToList();
            return contatos;
        }

'The property expression 'u => (u As Unidade).Tipo' is not valid. The expression should represent a property access: 't => t.MyProperty'.

Qualquer tipo de solução será bem vinda...

Abraço e obrigado pela ajuda!

3 respostas

Olá Eduardo,

pelo que andei pesquisando, não existe um jeito de fazer isso na primeira query direto. O que você precisará fazer é buscar primeiro todos os contatos e depois fazer uma segunda consulta só para carregar o Tipo apenas dos contatos que forem Unidade e depois mais uma consulta para carregar o Setor dos contatos de Funcionario. Achei este link com um cenário bem parecido com o que você tem e que mostra como carregar estas informações separadas.

Lucas, não consegui adaptar está solução ao meu problema...

public List<Contato> GetContatos()
        {
        var contatos =this._contexto.Contatos
                .Include(contato=>contato.Telefones)
                .OrderBy(contato => contato.Descricao)
                .ToList();

                 this._contexto.Entry(contatos )
                .Query()//<--Erro aqui!
                .OfType<Unidade>()
                .Include(contato=>contato.Tipo)
                .ToList();

                return this._contexto.Entry(contatos )
                .Query()//<--Erro aqui!
                .OfType<Funcionario>()
                .Include(funcionario => funcionario.setor)
                .ToList();
        }

Mas em ".Query()" estou obtendo a seguinte mensagem de erro: EnityEntry> não contém uma definição para Query.

Abraço!

Pode ser que esteja faltando importar o método. Tenta usar o atalho de Ctrl + . em cima do .Query() e veja se ele sugere algum using ... para importar um novo namespace onde estará este método.