代码之家  ›  专栏  ›  技术社区  ›  Paulo Milkdromeda

如何将group by和join从sql server转换为linq?

  •  0
  • Paulo Milkdromeda  · 技术社区  · 6 年前

    我在SQL Server中有以下代码:

    select SUM(td.Valor) as Total, s.Nome as [Servico Prestado] from Transacao tr
    left join TransacaoDivisao td on tr.CodTransacao = td.CodTransacao
    left join ServicosPrestado sp on td.CodServicoPrestado = sp.CodServicosPrestado
    left Join servico s on sp.CodServico = s.CodServico
    GROUP by s.nome order by 1 desc
    

    但当我试着皈依林肯时,我得到了这个:

    var res = 
      from transacao in dbContext.Transacao
      join td in dbContext.TransacaoDivisao on transacao.CodTransacao equals td.CodTransacao
      join sp in dbContext.ServicosPrestado on td.CodServicoPrestado equals sp.CodServicosPrestado
      join s in dbContext.Servico on sp.CodServico equals s.CodServico
    
    
      group s by s.Nome into gp
      select new
      {
          servicoPrestado = gp.Key,
          td.Valor // throw error
      };
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Sumit raj    6 年前

    你所做的是在代码中的内部连接,在sql中,你已经编写了left-join,所以我将使用left-join

    var res=(from tr in dbContext.Transacao
             join td in dbcontext.TransacaoDivisao
             on tr.CodTransacao equals td.CodTransacao
             into r11
             from r1 in r11.DefaultIfEmpty()
             join sp in dbcontext.ServicosPrestado
             on r1.CodServicoPrestado equals sp.CodServicosPrestado
             into r22
             from r2 in r22.DefaultIfEmpty()
             join s in dbContext.CodServico
             on r2.CodServico equals s.CodServico
             into r33 
             from r3 in r33.DefaultIfEmpty()
             select new {r1,r3})
             .GroupBy(x=>x.r3?.Nome)
             .Select(x=>new 
                        {
                          Total=x.Sum(z=>(z.r1==null?0:z.r1.Valor)),
                          Servico Prestado=x.Key
                        })
             .OrderByDescending(x=>x.Key)
             .ToList();