【问题标题】:Linq to SQL With Left Outer Join and Group By With Sum - How ToLinq to SQL with Left Outer Join and Group By With Sum - 如何
【发布时间】:2010-12-13 20:13:34
【问题描述】:

我正在尝试将下面的 SQL 查询转换为 Linq to SQL

select Categorias.IdCategoria, Categorias.Nome, SUM(lancamentos.valor)
from   lancamentos
left outer join Categorias on Lancamentos.IdCategoria = Categorias.IdCategoria
where  Month(DataLancamento) = 11
and    Credito = 1
and    Lancamentos.Ocultar = 0
group by Categorias.IdCategoria, Categorias.Nome

这就是我所做的

from    lancamento in Lancamentos
where   lancamento.Credito == true
&&      lancamento.Ocultar == false
&&      lancamento.DataLancamento.Month == 10
join    categoria in Categorias on lancamento.IdCategoria equals categoria.IdCategoria into temp
from    lancamentoJoinCategoria in temp.DefaultIfEmpty()
group   lancamentoJoinCategoria by new { lancamentoJoinCategoria.IdCategoria, lancamentoJoinCategoria.Nome } into x
select  new {
        IdCategoria = (int?)x.Key.IdCategoria
        , Nome = x.Key.Nome
}

如何将 SUM(lancamentos.valor) 添加到上面的 linq to sql 中?

【问题讨论】:

  • 我不明白你想要做的加入。你制定它的方式你想要得到 lancamentos 的总和,即使这些 lancamentos 不存在类别。因此,对于所有未分类的 lancamentos,您会得到一个额外的结果行,例如“NULL,NULL,42378”,对吗?这真的是你的意图还是你想要所有空类别的行像“24,SomeName,NULL”?

标签: c# linq linq-to-sql tsql


【解决方案1】:

会是:

(from lancamento in Lancamentos
join categoria in Categorias on lancamento.IdCategoria equals categoria.IdCategoria into temp
from lancamentoJoinCategoria in temp.DefaultIfEmpty()

where lancamento.Credito == true
&& lancamento.Ocultar == false
&& lancamento.DataLancamento.Month == 10

group lancamento by new { lancamentoJoinCategoria.IdCategoria, lancamentoJoinCategoria.Nome } into x
select new
{
    IdCategoria = (int?)x.Key.IdCategoria,
    Nome = x.Key.Nome,
    sumValor = x.Sum(a=>a.valor)
});

【讨论】:

    【解决方案2】:

    您使用 .Sum() 方法。

    例如;

    Public Sub LinqToSqlCount03()
        Dim q = (From o In db.Orders _
            Select o.Freight).Sum()
    
    Console.WriteLine(q)
    End Sub
    

    【讨论】:

    • Pace,我知道我必须使用 .Sum() 方法。但是我如何将它添加到我显示的查询中?
    【解决方案3】:

    根据MSDN,没有等效于 Sum() 操作的查询表达式。 我提供了一个小示例,您可以如何在查询中使用 Sum() 的方法语法。

    一些查询操作,比如Count 或 Max,没有等效查询 表达式子句,因此必须 表示为方法调用。方法 语法可以与查询结合 各种方式的语法。更多 信息,请参阅LINQ Query Syntax versus Method Syntax (C#)

    var example = new[]
        {
            new { Count = 1, Name = "a" }, new { Count = 2, Name = "b" },
            new { Count = 2, Name = "c" }, new { Count = 2, Name = "c" }
        };
    
    var result = from x in example
                    select new 
                    {
                        x.Name, 
                        Sum = (from y in example 
                               where y.Count.Equals(2) 
                                   && y.Name==x.Name
                               select y.Count).Sum()
                    };
    var distinct = result.Distinct().ToList();
    

    【讨论】:

      猜你喜欢
      • 2015-04-26
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2021-08-02
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多