У меня есть запрос, чтобы узнать, сколько сущностей было добавлено пользователями (Version = 1
) и какие сущности они обновили (Version > 1
).Он запрашивает всю таблицу и группы по имени пользователя записи.Это необработанный запрос SQL:
SELECT
[s.InternalUser].[UserName],
COUNT(CASE WHEN s.Version = 1 THEN 1 END) AS [InsertCount],
COUNT(CASE WHEN s.Version > 1 THEN 1 END) AS [UpdateCount]
FROM [Sale] AS [s]
INNER JOIN [InternalUser] AS [s.InternalUser] ON [s].[InternalUserId] =
[s.InternalUser].[InternalUserId]
GROUP BY [s.InternalUser].[UserName]
Это возвращает то, что я хочу.Я попытался перевести это на запрос Linq в проекте с использованием EF Core 2.2:
var countData = await _context.Sale
.GroupBy(s => s.InternalUser.UserName)
.Select(g => new
{
UserName = g.Key,
InsertCount = g.Count(s => s.Version == 1),
UpdateCount = g.Count(s => s.Version > 1)
})
.ToListAsync();
Однако это приводит к загрузке всей таблицы и вычислений в памяти:
Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'GroupBy ([s.InternalUser] .UserName, [s])' не может быть переведено и будет оцениваться локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'where ([s] .Version == 1)' не может быть переведено и будет оценено локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'Count ()' не может быть переведено и будет оцениваться локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'where ([s] .Version == 1)' не может быть переведено и будет оценено локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'Count ()' не может быть переведено и будет оцениваться локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'where ([s] .Version> 1)' не может быть переведено и будет оценено локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'Count ()' не может быть переведено и будет оцениваться локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'where ([s] .Version> 1)' не может быть переведено и будет оценено локально.Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'Count ()' не может быть переведено и будет оценено локально.
Это запрос Count()
, который вызывает его, если я удалю этоGroup By преобразуется в запрос.
Есть ли другой способ написания этого, который переводил бы что-то вроде SQL-запроса, который я опубликовал ранее?