у меня две таблицы
Школьные попытки
Пользователи Aspnet
Я хочу получить из базы данных (mysql) лучшие оценки всех пользователей с их полными именами.
Вот мой LINQ:
from attempts in (from q in Schoolattempts
group q by q.UserId into g
select g.OrderByDescending(c => c.Rating).First())
join users in Aspnetusers on attempts.UserId equals users.Id
select new
{
FullName = users.LastName + " " + users.FirstName + " " + users.MiddleName,
Rating = attempts.Rating
}
Но EF Core не смог преобразовать его в SQL;
Вот ошибка:
InvalidOperationException: The LINQ expression 'DbSet<Schoolattempts>()
.GroupBy(s => s.UserId)
.Select(g => g
.AsQueryable()
.OrderByDescending(e => e.Rating)
.First())
.Join(
inner: DbSet<Aspnetusers>(),
outerKeySelector: e0 => e0.UserId,
innerKeySelector: a => a.Id,
resultSelector: (e0, a) => new TransparentIdentifier<Schoolattempts, Aspnetusers>(
Outer = e0,
Inner = a
))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.





Вы должны помнить, что как только вы выполните оператор GroupBy, он сгруппирует несколько строк по ключу.
Вот два примера, которые, я думаю, дадут вам желаемый результат, но настроены так, чтобы, надеюсь, было легче понять, что происходит.
Получение списка с суммой оценок:
Schoolattempts
.Join(
Aspnetusers,
x => x.UserID,
y => y.UserID,
(x, y) => new {
Name = y.LastName + " " + y.FirstName + " " + y.MiddleName,
Id = x.UserID,
Rating = x.Rating
})
.GroupBy(x => x.User) //Grouping the data
.Select(x => new {
Name = x.First().Name,
Rating= x.Sum(y => y.Rating) //Getting the sum of the ratings of the user
})
.OrderByDescending(x => x.Rating) //Order the result from highest to lowest rating
Получая список с самым высоким рейтингом каждого пользователя вместо суммы, последний блок выбора вместо этого будет выглядеть так:
.Select(x => new {
Name = x.First().Name,
Rating= x.Max(y => y.Rating) //Getting the highest rating of the user
})
Это просто вопрос добавления к этому присоединения :) Я обновлю ответ примером, который включает в себя присоединение.
Спасибо за ответ, но у меня нет внешнего ключа между aspnetusers и schoolattempts, поэтому я использовал соединение.