none
Consulta Linq C# RRS feed

  • Pergunta

  • Boa tarde

    Tenho a seguinte estrutura de banco de dados:

    Tabelas:

    -Usuario

    -Grupo

    -Permissao

    E todas as relações N pra N:

    - GrupoUsuario

    - PermissaoUsuario

    - PermissaoGrupo

    Montei uma consulta pra retornar o usuário, independente de Grupos e Permissões (LEFT JOIN) com Linq em C#.

    Segue:

    tbUsuario = (from _u in _authEntities.tb_usuario
                                  join _gu in _authEntities.tb_grupo_usuario on _u.id_tb_usuario equals _gu.id_tb_usuario
                                  into u
                                  from usuario in u.DefaultIfEmpty()
                                  join _pu in _authEntities.tb_permissao_usuario on _u.id_tb_usuario equals _pu.id_tb_usuario
                                  into p
                                  from permissao in p.DefaultIfEmpty()
                                  where _u.login == login && _u.senha == senha
                                  select _u).SingleOrDefault();

    Só que está faltando o LEFT JOIN para a tabela 'tb_permissao_grupo'.

    Alguém poderia me ajudar com isso?

    Desde já, agradeço.

    quinta-feira, 26 de janeiro de 2017 16:50

Todas as Respostas

  • Olá,
    Utilize o DefaultIfEmpty para o Left Join.
    Segue um link com explicação e exemplo:

    https://msdn.microsoft.com/pt-BR/library/bb397895.aspx

    Ok?

    --
    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta

    quinta-feira, 26 de janeiro de 2017 17:04
  • Oi Rodrigo

    Na verdade já estou usando o DefaultIfEmpty.

    Assim como fiz com as outras junções.

    Porém estou com dificuldades na última junção, conforme mencionei:

    - tb_permissao_grupo (Permissao x Grupo)

    A partir da consulta que eu já montei.


    • Editado Rafaselic quinta-feira, 26 de janeiro de 2017 18:16
    quinta-feira, 26 de janeiro de 2017 18:14
  • Bom dia,

     Segue um exemplo usando Left em varias tabelas:

    var sql = ctx.TB1
                               .GroupJoin(ctx.TB2,
                                          t1 => t1.ID,
                                          t2 => t2.ID,
                                          (t1, t2) => new { t1, t2 })
                               .SelectMany(i => i.t2.DefaultIfEmpty(),
                                          (t1, t2) => new { t1, t2 })
                               .GroupJoin(ctx.TB3,
                                           t1 => t1.t1.t1.ID,
                                           t3 => t3.ID,
                                           (t1, t3) => new { t1, t3 })
                               .SelectMany(i => i.t3.DefaultIfEmpty(),
                                          (t1, t3) => new { t1, t3 })
                               .Where(i => i.t1.t1.t1.t1.ID == 5)
                               .ToList();
     Repare que o conceito é o mesmo para uma ou muitas... Nesse exemplo filtrei onde o ID da TB1 seja igual a cinco.

    sexta-feira, 27 de janeiro de 2017 09:56