Linq Query获取最近x年中每年的最后一个条目

时间:2018-11-15 16:39:36

标签: c# sql-server linq linq-query-syntax

我在MSSQL表中有一个表,其中包含使用情况数据。对于报告,我只需要加载过去10年中每年的最后一个条目。

示例

ID |    Hits    | GeneratedAt
 1 |     12     | 20171231 
 2 |     35     | 20161231
 3 |     5      | 20151230
 4 |     10     | 20141231

是否有一种方法可以使用单个linq查询获取此值,或者可以以某种方式组合多个linq查询?

我想出的主意是在寻找12月31日,但是由于任何原因,这个日期都将造成问题。相反,查询应加载最后一个可用的日期(如ID 3)。

private static IQueryable<Usage> GetYearValues(IQueryable<Usage> queryable)
{
    var firstYear = DateTime.Now.AddYears(-10);

    var yInfosArray = queryable
        .Where(
            s.GeneratedAt.Year >= firstYear.Year
            && s.GeneratedAt.Month == 12
            && s.GeneratedAt.Day == 31 || s.GeneratedAt >= today
        )
        .OrderByDescending(s => s.GeneratedAt);
    return yInfosArray;
}

1 个答案:

答案 0 :(得分:2)

只需按降序排序,按年份分组,然后在每个组中选择第一个条目:

queryable
    .Where(x => x.GeneratedAt.Year >= DateTime.Now.Year - n) // if this year doesn't count to last n years, remove the `=` sign
    .OrderByDescending(x => x.ID) // or, by x.GeneratedAt if the table isnt time sorted
    .GroupBy(x => x.GeneratedAt.Year, (year, g) => g.First()) // select last (first in desc) of each year