Usuário com melhor resposta
Consulta de relacionamento generica utilizando LinqKit

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?
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 Getpublic IQueryable<TEntity> Get() { return contexto.Set<TEntity>().AsExpa
ndable ().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
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. -
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?
-
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.- Marcado como Resposta Robson William SilvaModerator segunda-feira, 25 de julho de 2016 18:49
- Não Marcado como Resposta DevMaicon segunda-feira, 8 de agosto de 2016 17:18
-
-
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 Getpublic IQueryable<TEntity> Get() { return contexto.Set<TEntity>().AsExpa
ndable ().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