Это занимает столько времени, потому что запрос вызывает оценку клиента .См. Проблемы производительности оценки клиента и как использовать Ведение журнала оценки клиента для выявления связанных проблем.
Если вы действительно используете EF Core 2.0, вы ничего не можете сделатьчем обновление до версии 2.1, которая содержит улучшенный перевод LINQ GroupBy .Даже с этим решение не простое - запрос все еще использует оценку клиента.Но его можно переписать, разделив часть GroupBy
на подзапрос и присоединив ее к таблице Users
, чтобы получить необходимую дополнительную информацию.
Примерно так:
var scores = db.Scores.AsQueryable();
// Optional
// scores = scores.Where(p => p.CategoryId == categoryId);
var points = scores
.GroupBy(s => s.UserId)
.Select(g => new
{
UserId = g.Key,
Points = g.Sum(s => s.Points),
});
var result = db.Users
.Join(points, u => u.UserId, p => p.UserId, (u, p) => new
{
u.UserId,
u.Name,
p.Points
})
.OrderBy(p => p.Points)
.ToList();
Thisпо-прежнему выдает предупреждение
Выражение LINQ 'orderby [p] .Points asc' не может быть переведено и будет оценено локально.
, но по крайней мере запроспереводится и выполняется как один SQL:
SELECT [t].[UserId], [t].[Points], [u].[UserId] AS [UserId0], [u].[Name]
FROM [Users] AS [u]
INNER JOIN (
SELECT [s].[UserId], SUM([s].[Points]) AS [Points]
FROM [Scores] AS [s]
GROUP BY [s].[UserId]
) AS [t] ON [u].[UserId] = [t].[UserId]