如何在 LINQ 中计算累积和?
Posted
技术标签:
【中文标题】如何在 LINQ 中计算累积和?【英文标题】:How to calculate a cummulative sum in 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 中的窗口函数未实现。只能通过第三方扩展。 【参考方案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();
【讨论】:
谢谢,我正在测试它 如果有问题请告诉我? 现在试试? 感谢您的帮助,对我帮助很大。以上是关于如何在 LINQ 中计算累积和?的主要内容,如果未能解决你的问题,请参考以下文章