none
Consulta de relacionamento generica utilizando LinqKit RRS feed

  • Pergunta

  • Galera...

    estou utilizando a seguinte consulta, de forma genérica utilizando LinqKit
    public IQueryable<TEntity> Get()
    {
        return contexto.Set<TEntity>().AsExpandable().AsQueryable();
    }
    using (var repositorioClientes = new ClienteRepositorio())
    {
         cliente = repositorioClientes.Get().Where(c => c.ClienteID == id).SingleOrDefault();
    }
    



    Funciona muito bem..
    porém, gostaria de trazer os dados da tabela relacionada TELEFONES que está relacionado com Clientes 1 pra muitos.

    Fiz o teste e dando include("Telefones") no método Get() funciona perfeitamente

    return contexto.Set<TEntity>().Include("Telefones").AsExpandable().AsQueryable();

    Porém, como faria isso de forma genérica?


    segunda-feira, 11 de julho de 2016 02:43

Respostas


  • o meu problema era o LinqKit.
    Utilizando o LinqKit tem que utilizar o metodo .AsExpandable() no retorno...
    acabei descobrindo depois de muita busca que O include simplesmente não funciona utilizando o AsExpandable() no retorno.

    O Include() deve ser antes do AsExpandable()

    Entao mudei o metodo Get

    public IQueryable<TEntity> Get()
    {
     return contexto.Set<TEntity>().AsExpandable().AsQueryable();
    }

    para Get com Includes dinamico, dessa forma:

    public IQueryable<TEntity> GetLinqKit(params Expression<Func<TEntity, object>>[] includes)
    {
        // INCLUDE DEVE SER ANTES DO AsExpandable() do linqKit, por isso a implementação dinamica como parametro
        var query = includes.Aggregate(
            contexto.Set<TEntity>().AsQueryable(),
            (current, include) => current.Include(include)
            );
    
        return query.AsExpandable().AsQueryable(); // Necessario AsExpandable() por causa do LinqKit
    }

    utilizado assim:

    cliente = repositorioClientes.GetLinqKit(c=> c.Telefones).Where(c => c.ClienteID == id).SingleOrDefault();

    estou aberto a sugestões..

    espero ajudar outras pessoas.

    Obrigado
    • Marcado como Resposta DevMaicon segunda-feira, 8 de agosto de 2016 17:16
    • Editado DevMaicon segunda-feira, 8 de agosto de 2016 17:17
    segunda-feira, 8 de agosto de 2016 17:16

Todas as Respostas

  • Bom dia Michaeel,

    E se você tentar assim

    string noname = "Telefone"; // Aqui seria o valor dinâmico. 
    
    return contexto.Set<TEntity>().Include('"+noname+"').AsExpandable().AsQueryable();


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 20 de julho de 2016 03:41
  • mas pode ter 1 ou varios includes relacionados na entidade.  dessa forma ai não ficaria dinâmico

    queria fazer a consulta assim:

    cliente = repositorioClientes.Get().Include("Telefones").Include("Telefones.Contatos").Where(c => c.ClienteID == id).SingleOrDefault();

    ele não da erro, mas simplesmente não funciona.

    então acabei descobrindo que isso acontece por causa do método AsExpandable() do LinqKit.
    Includes depois dele não funcionam. Apenas se for antes de AsExpandable()

    Como estão fazendo Get() depois include não funciona.

    como fazer para dar include utilizando LinqKit e que seja dinamico?

    sábado, 23 de julho de 2016 18:49
  • Bom dia Michaeell,

    Dinâmico = Valor não fixo.

    No caso você quer que seja com múltiplas entradas. 

    using (var contexto = new Contexto())
    {
        var query = from e in contexto.Estados
                                        .Include(e => e.Cidades)
                                        .Include(e => e.Pais)
                    where e.Nome == "São Paulo"
                    select e;
    
        result = query.Single();
    }


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 25 de julho de 2016 12:03
  • isso mesmo..

    gostaria que fosse dinâmico e com multiplas entradas

    segunda-feira, 25 de julho de 2016 13:12

  • o meu problema era o LinqKit.
    Utilizando o LinqKit tem que utilizar o metodo .AsExpandable() no retorno...
    acabei descobrindo depois de muita busca que O include simplesmente não funciona utilizando o AsExpandable() no retorno.

    O Include() deve ser antes do AsExpandable()

    Entao mudei o metodo Get

    public IQueryable<TEntity> Get()
    {
     return contexto.Set<TEntity>().AsExpandable().AsQueryable();
    }

    para Get com Includes dinamico, dessa forma:

    public IQueryable<TEntity> GetLinqKit(params Expression<Func<TEntity, object>>[] includes)
    {
        // INCLUDE DEVE SER ANTES DO AsExpandable() do linqKit, por isso a implementação dinamica como parametro
        var query = includes.Aggregate(
            contexto.Set<TEntity>().AsQueryable(),
            (current, include) => current.Include(include)
            );
    
        return query.AsExpandable().AsQueryable(); // Necessario AsExpandable() por causa do LinqKit
    }

    utilizado assim:

    cliente = repositorioClientes.GetLinqKit(c=> c.Telefones).Where(c => c.ClienteID == id).SingleOrDefault();

    estou aberto a sugestões..

    espero ajudar outras pessoas.

    Obrigado
    • Marcado como Resposta DevMaicon segunda-feira, 8 de agosto de 2016 17:16
    • Editado DevMaicon segunda-feira, 8 de agosto de 2016 17:17
    segunda-feira, 8 de agosto de 2016 17:16