У меня есть таблица SQL Items
с макетом
Code | UpdatedAt | data columns...
------------------------
0001 | 2017-01-01 | ..
0001 | 2017-01-02 | ..
0002 | 2017-01-01 | ..
0003 | 2017-01-01 | ..
и я хочу выбрать все Items
с последним значением UpdatedAt
в ef core 2.1
для Item
с кодом code
, следующее работает и переводится в один запрос SQL:
var latestItemVersion = await DbContext.Items.Where(p => p.Code == code).OrderByDescending(p => p.UpdatedAt).FirstOrDefaultAsync()
, но для списка всех последних Items
:
var latestItemVersions = await DbContext.Items.GroupBy(p => p.Code).Select(g => g.OrderByDescending(p => p.UpdatedAt).First()).ToListAsync()
возвращает правильные результаты, но приводит к запросу типа SELECT * from [Items] ORDER BY [code]
и группирует результаты локально.
EF регистрирует предупреждения:
The LINQ expression 'GroupBy([p].Code, ... could not be translated and will be evaluated locally.
The LINQ expression 'orderby [p].UpdatedAt desc' could not be translated and will be evaluated locally.
The LINQ expression 'First()' could not be translated and will be evaluated locally.
Как превратить это во что-то, что преобразуется в один SQL-запрос?Возможно ли это?