如何在LINQ

时间:2015-07-31 12:59:44

标签: c# linq

我有这个查询

SELECT t.NomeTipo, sum(v.QtdProduto) 
FROM [dbo].[Vendas] AS V 
RIGHT JOIN [dbo].[Produtos] AS P ON V.IdProduto = P.IdProduto
INNER JOIN [dbo].[Tipos] AS T ON P.IdTipo = T.IdTipo  
group by t.NomeTipo 
order by t.NomeTipo

我试过这个

var queryTipos = from vendas in repositorioVendas.Vendas
join produtos in repositorioProduto.Produtos.DefaultIfEmpty()
on vendas.IdProduto equals produtos.IdProduto
join tipos in repositorioTipo.Tipos
on produtos.IdTipo equals tipos.IdTipo
group vendas by new { tipos.NomeTipo, vendas.QtdProduto }
into novoGrupo
select new
{
    NomeTipo = novoGrupo.Key.NomeTipo,
    QtdProduto = novoGrupo.Sum(x => x.QtdProduto)
};

使用此查询我只得到两个结果,但是当我从数据库直接运行时,我得到这样的结果:

Bebidas     16
Bolos       14
Frios       16
Pães        21

1 个答案:

答案 0 :(得分:2)

诀窍是要意识到你可以通过交换前两个表的顺序用左连接而不是右连接重写你的查询,并且Linq没有办法真正处理正确的连接。你的分组也是错误的。

var queryTipos = from produtos in repositorioProduto.Produtos 
                 join vendas_pj in repositorioVendas.Vendas
                 on vendas_pj.IdProduto equals produtos.IdProduto into joined
                 from vendas in joined.DefaultIfEmpty()
                 join tipos in repositorioTipo.Tipos
                 on produtos.IdTipo equals tipos.IdTipo
                 group vendas by tipos.NomeTipo
                 into novoGrupo
                 select new
                 {
                    NomeTipo = novoGrupo.Key,
                    QtdProduto = novoGrupo.Sum(x => x.QtdProduto)
                 };

基本上是SQL中的左连接

From TableA
Left Join TableB 
On TableA.ID = TableB.ID

在Linq中完成,就像这样

from a in repo.TableA
join b_pj in repo.TableB
on a.ID equals b_pj.ID into joined
from b in joined.DefaultIfEmpty()