Linq Query для получения последней записи каждого года за последние x лет - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть таблица в таблице MSSQL, которая содержит данные об использовании.Для отчета мне нужно загружать только последнюю запись каждого года за последние 10 лет.

Пример

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

Есть ли способ получить эти значения с помощью одного linqзапросы или я могу как-то объединить несколько запросов linq?

Идею, которую я придумал, искал 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 голосов
/ 15 ноября 2018

Просто сортируйте по убыванию, группируйте по годам и выбирайте первую запись внутри каждой группы:

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
...