none
Problemas com JOIN usando LINQ/LAMBDA e WHERE. RRS feed

  • Pergunta

  • Olá pessoal, 

    Eu tenho uma tabela com diversas colunas, e estou consultando ela utilizando LINQ TO SQL com Lambda Expression.
    Devido ao fator de ter diversas colunas e minha consulta ser do ano inteiro, eu criei uma outra classe na minha aplicação que seria basicamente com as propriedades que eu desejo obter, desta forma minha query ficou bem rápida.

    A minha consulta foi esta:

    List<ChamadoRelatorio> chamados = dataContext.Chamados

                    .Where(c => c.DataAbertura > dataInicial && c.DataAbertura < dataFinal)
                    .Select(c => new ChamadoRelatorio
                    {
                        Id = c.Id,
                        DataAbertura = c.DataAbertura,
                        GrupoAtendimento = c.GrupoOrigem.Nome,
                        IdGrupoAtendimento = c.GrupoOrigem.Id,
                        IdCliente = c.IdCliente,
                        IdAtendimento = c.IdAtendimento
                    }).ToList();

    Vejam que no "new ChamadoRelatorio" eu já estou preenchendo meu novo objeto em base da query que realizei.

    Agora surgiu a necessidade de eu criar mais uma propriedade, porém esta informação vem de outra tabela que possui um relacionamento. Eu poderia criar uma View, jogar no meu DBML e resolver o problema, porém eu estou tentando fazer um JOIN.

    Eu fiz um JOIN, mas o problema é que eu estou recebendo os dados muito acima do esperado, exemplo: eu deveria receber uns 6 mil registros registros, mas estou recebendo mais de 63 mil registros.

    Ou seja, não existem 63 mil registros, depurando na coleção eu percebi que ele está trazendo o mesmo registros, 2, 3 ou mais vezes, só que preenchendo com outros dados, não sei direito está confuso. A query que montei foi esta:

    List<ChamadoRelatorio> chamados = dataContext.Chamados
                    .Where(c => c.DataAbertura > dataInicial && c.DataAbertura < dataFinal)
                    .Join(dataContext.TempoProcessos, c => c.IdAtendimento, t => t.IdAtendimento, (c, t)
                        => new ChamadoRelatorio
                        {
                            Id = c.Id,
                            DataAbertura = c.DataAbertura,
                            GrupoAtendimento = c.GrupoOrigem.Nome,
                            IdGrupoAtendimento = c.GrupoOrigem.Id,
                            IdCliente = c.IdCliente,
                            IdAtendimento = c.IdAtendimento,
                            IdUsuario = t.IdUsuario
                        }).ToList();

    Estou analisando, e caso consiga achar alguma solução eu posto aqui.
    Abraços :D

    sexta-feira, 22 de junho de 2012 19:54

Respostas

  • Consegui resolver o problema.

    1º Eu fiz a consulta direto na tabela com N registros especificando o where.
    Ufaaa! 

    List<ChamadoRelatorio> chamados = dataContext.TempoProcessos
                    .Where(t => t.DataInicio > dataInicial && t.DataInicio < dataFinal && t.Processo.Equals(1))
                    .Join(dataContext.Chamados, t => t.IdAtendimento, c => c.IdAtendimento, (t, c)
                        => new ChamadoRelatorio
                        {
                            Id = c.Id,
                            DataAbertura = c.DataAbertura,
                            GrupoAtendimento = c.GrupoOrigem.Nome,
                            IdGrupoAtendimento = c.GrupoOrigem.Id,
                            IdCliente = c.IdCliente,
                            IdAtendimento = c.IdAtendimento,
                            IdUsuario = t.IdUsuario
                        }).ToList();

    • Marcado como Resposta Rodrigo Epic sexta-feira, 22 de junho de 2012 22:31
    sexta-feira, 22 de junho de 2012 22:31

Todas as Respostas

  • Mais uma observação, a outra tabela que possui relacionamento, possui N registros. Ou seja 1 para N.

    sexta-feira, 22 de junho de 2012 22:21
  • Consegui resolver o problema.

    1º Eu fiz a consulta direto na tabela com N registros especificando o where.
    Ufaaa! 

    List<ChamadoRelatorio> chamados = dataContext.TempoProcessos
                    .Where(t => t.DataInicio > dataInicial && t.DataInicio < dataFinal && t.Processo.Equals(1))
                    .Join(dataContext.Chamados, t => t.IdAtendimento, c => c.IdAtendimento, (t, c)
                        => new ChamadoRelatorio
                        {
                            Id = c.Id,
                            DataAbertura = c.DataAbertura,
                            GrupoAtendimento = c.GrupoOrigem.Nome,
                            IdGrupoAtendimento = c.GrupoOrigem.Id,
                            IdCliente = c.IdCliente,
                            IdAtendimento = c.IdAtendimento,
                            IdUsuario = t.IdUsuario
                        }).ToList();

    • Marcado como Resposta Rodrigo Epic sexta-feira, 22 de junho de 2012 22:31
    sexta-feira, 22 de junho de 2012 22:31