C# LINQ基于最新日期的分录总和
我有一张这样的桌子:C# LINQ基于最新日期的分录总和,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有一张这样的桌子: Code | BuildDate | BuildQuantity --------------------------------- 1 | 2013-04-10 | 4 1 | 2014-09-23 | 1 1 | 2014-08-20 | 2 7 | 2014-02-05 | 4 我希望LINQ查询为每个代码提取最新的构建日期,为该代码提取构建数量,依此类推所有记录,并对其进行汇总。因此,对于上面的数据,结果应该是1+4=5 这就是我正在尝试
Code | BuildDate | BuildQuantity
---------------------------------
1 | 2013-04-10 | 4
1 | 2014-09-23 | 1
1 | 2014-08-20 | 2
7 | 2014-02-05 | 4
我希望LINQ查询为每个代码提取最新的构建日期,为该代码提取构建数量,依此类推所有记录,并对其进行汇总。因此,对于上面的数据,结果应该是1+4=5
这就是我正在尝试的:
var built = (from tb in db.Builds
orderby tb.BuildDate descending
group tb by tb.Code into tbgrp
select tbgrp.Sum(c => c.BuildQuantity)).First();
此查询返回7。。。我做错了什么?在取第一个之前,您正在求和所有代码的构建量,而不是求和第一个
int built = db.Builds
.GroupBy(b => b.Code)
.Sum(g => g.OrderByDescending(b => b.BuildDate).First().BuildQuantity);
您正在查找每个代码的最后一个条目的生成数量之和。您当前在分组之前进行排序,实际上没有做任何事情(在分组之后,没有定义排序) 首先,您需要通过代码获取最新的元素。让我们先分组。我更喜欢通过扩展方法写作:
IGrouping<int, Build> grouped = db.Builds.GroupBy(tb => tb.Code)
最后,我们可以得到总和:
var sum = firsts.Sum(tb => tb.BuildQuantity);
把这些都插在一起就成了
var sum = db.Builds.GroupBy(tb => tb.Code).
.Select(gr => gr.OrderByDescending(gr => gr.BuildDate).First())
.Sum(tb => tb.BuildQuantity);
Group by具有重载,允许您滚动组中的几乎所有内容
如果您喜欢紧凑的代码,您可以编写
var sum = db.Builds
.GroupBy(tb => tb.Code,
tb => tb,
gr => gr.OrderByDescending(gr => gr.BuildDate)
.First()
.BuildQuantity)
.Sum()
尽管从可读性的角度来看,我不推荐使用它您的代码是在分组后先求和,然后再求第一,因此代码=1,值=1+2+4=7,代码=7被排除在外
var sum = db.Builds
.GroupBy(tb => tb.Code,
tb => tb,
gr => gr.OrderByDescending(gr => gr.BuildDate)
.First()
.BuildQuantity)
.Sum()