【问题标题】:How to calculate a cummulative sum in LINQ?如何在 LINQ 中计算累积和?
【发布时间】:2021-10-24 09:46:45
【问题描述】:

我使用带有实体框架的 C# 开发了我的程序,并使用 LINQ 进行查询。我在将我的 SQL 查询转换为 LINQ 时遇到了问题。

我不知道该怎么办。

这是我在 SQL Server 中的 SQL 查询:

SELECT bs.idBalancesortie, bs.datesortie, bs.c_num_debut,bs.c_num_fin,bs.nombredetickets
    , n.quotite, bs.montant
    , SUM(bs.montant) OVER (ORDER BY bs.idNature ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as Cumul
    , bs.idNature
FROM BalanceSortie bs
LEFT JOIN Natures n on bs.idNature = n.idNature
order BY bs.idNature

【问题讨论】:

  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。并且请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 嗨,所以这是直接的问题,LINQ 与 Sql 或 Sql Server 无关。您使用的是 EF 还是某种 ORM,为什么您认为 linq 会在这里为您提供帮助?您是否有与您的数据相关的 C# 模型...只需多一点解释以及上述所有要点都会有很长的路要走
  • 我正在使用实体框架从模型生成数据库
  • EF 中的窗口函数未实现。只能通过第三方扩展。

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


【解决方案1】:

它计算“montant”的累积和,但我希望这个累积和由“idNature”完成

例如

id Category montant  cumul
1   C         49       49
2   A         4        4
3   A         16      20

4

【讨论】:

  • 这似乎不是一个答案。你为什么发布这个?
  • 我相信我的回答让您感到惊讶..您的代码运行良好,但它并没有解决我的问题..我的目标是计算自然“montant”的累积总和。再次感谢您的宝贵帮助!
  • 我真希望人们不要删除 cmets。
  • 你应该改变你原来的帖子,因为那里的cumul只是montant的运行总和。
【解决方案2】:

更新了每个 idNature 的累积重置为零

我没有测试过这个解决方案,但获得运行总和的关键是创建“cumul”变量并使用多语句 lambda。这将需要在 Join 之后提前执行(.ToList() 或 AsEnumerable())。

我添加了第二个变量,它保存“当前的 idNature。假设它是一个 int 并且它不能是 -1。

    decimal cumul = 0; // define a variable
    int idNature = -1;
    var target = BalanceSorties
        .Join(idNature, bs => bs.idNature, n => n.idNature, (bs, n) => new { bs, n })
        .OrderBy(q => q.n.idNature)
        .AsEnumerable()
        .Select(q => 
        {
            if (idNature != q.n.idNature)
            {
               cumul =0;
               idNature = q.n.IdNature;
            }
            cumul += q.bs.montant;
            return new
            {
                q.bs.idBalancesortie,
                q.bs.datesortie,
                q.bs.c_num_fin,
                q.bs.nombredetickets,
                q.n.quotité,
                Cumul = cumul,
                q.bs.idNature
            };
        })
    
        .ToList();

【讨论】:

  • 谢谢,我正在测试它
  • 如果有问题请告诉我?
  • 现在试试?
  • 感谢您的帮助,对我帮助很大。
猜你喜欢
  • 2019-08-23
  • 2021-05-11
  • 2014-05-15
  • 1970-01-01
  • 2014-02-16
  • 2021-09-03
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多