LINQ Sum of entries based on latest date

牧云@^-^@ 提交于 2021-01-28 04:57:19

问题


I have a table like so:

Code | BuildDate  | BuildQuantity
---------------------------------
1    | 2013-04-10 | 4
1    | 2014-09-23 | 1
1    | 2014-08-20 | 2
7    | 2014-02-05 | 4

I want the LINQ query to pick up the LATEST Build date for each Code, pick the BuildQuantity for that Code, and so on for all the records, and sum it up. So for the data above, the result should be 1 + 4 = 5.

This is what I'm trying:

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

This query returns 7... What am I doing wrong?


回答1:


You are summing all code's BuildQuantities before you take the first, instead you want to sum the firsts.

int built = db.Builds
    .GroupBy(b => b.Code)
    .Sum(g => g.OrderByDescending(b => b.BuildDate).First().BuildQuantity); 



回答2:


You are looking for the sum of the build quantity of the last entry per code. You're currently ordering before you group, which doesn't actually do anything (after the group, the ordering isn't defined)

So first of, you're looking to get the latest element by code. Lets group first. I'm more comfortable writing through the extension methods:

IGrouping<int, Build> grouped = db.Builds.GroupBy(tb => tb.Code)

we now have the elements grouped. From each group, we want to get the first element ordered descending by build date.

var firsts = grouped.Select(gr => gr.OrderByDescending(gr => gr.BuildDate)
                                    .First())

finally, we can get the sum:

var sum = firsts.Sum(tb => tb.BuildQuantity);

plugging this all together becomes

var sum = db.Builds.GroupBy(tb => tb.Code).
          .Select(gr => gr.OrderByDescending(gr => gr.BuildDate).First())
          .Sum(tb => tb.BuildQuantity);

Group by has overloads that allows you to roll almost everything in the group.

If you like compact code, you could write

var sum = db.Builds
          .GroupBy(tb => tb.Code,
                   tb => tb,
                   gr => gr.OrderByDescending(gr => gr.BuildDate)
                           .First()
                           .BuildQuantity)
          .Sum()

though I wouldn't recommend it from a readability point of view



来源:https://stackoverflow.com/questions/26015682/linq-sum-of-entries-based-on-latest-date

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!