Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ基于最新日期的分录总和_C#_Linq_Linq To Sql - Fatal编程技术网

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()