Linq 查询获取过去 x 年每年的最后一个条目
Linq Query to get last entry of every year in the last x years
我在 MSSQL table 中有一个 table,其中包含使用数据。对于报告,我只需要加载过去 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;
}
只需按降序排序,按年份分组,然后在每个组中选择第一个条目:
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
我在 MSSQL table 中有一个 table,其中包含使用数据。对于报告,我只需要加载过去 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;
}
只需按降序排序,按年份分组,然后在每个组中选择第一个条目:
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