Ключ здесь "Это может означать либо ошибку, либо ограничение в EF Core" в сообщении об исключении (чтение "может означать" , так как "указывает"). Хотя EF Core 3.0 улучшил перевод запросов, он по-прежнему не поддерживает множество шаблонов запросов, особенно по результату GroupBy
. И поскольку он также удалил оценку клиента, запросы, которые работали в 2.x из-за тихой оценки клиента, теперь просто терпят неудачу.
С другой стороны, EF Core 3.0 улучшил перевод последнего элемента всгруппировать шаблон с помощью SQL-конструкции ROW_NUMBER OVER (PARTITION BY
. Однако это не работает для результатов GroupBy
, поэтому вам нужно выполнить группировку вручную, используя запрос Distinct
для ключей и коррелированный подзапрос для значений.
Например, следующий запрос LINQ
from listingId in db.ListingFlagValues.Select(x => x.ListingId).Distinct()
from lfv in db.ListingFlagValues
.Where(x => x.ListingId == listingId)
.OrderByDescending(e => e.Timestamp)
.Take(1)
select lfv
успешно переводит и выполняет с использованием следующего SQL
SELECT [t1].[Id], [t1].[ListingId], [t1].[NewFlagValueId], [t1].[Timestamp]
FROM (
SELECT DISTINCT [l].[ListingId]
FROM [ListingFlagValues] AS [l]
) AS [t]
INNER JOIN (
SELECT [t0].[Id], [t0].[ListingId], [t0].[NewFlagValueId], [t0].[Timestamp]
FROM (
SELECT [l0].[Id], [l0].[ListingId], [l0].[NewFlagValueId], [l0].[Timestamp], ROW_NUMBER() OVER(PARTITION BY [l0].[ListingId] ORDER BY [l0].[Timestamp] DESC) AS [row]
FROM [ListingFlagValues] AS [l0]
) AS [t0]
WHERE [t0].[row] <= 1
) AS [t1] ON [t].[ListingId] = [t1].[ListingId]