Оценить EF-запрос с MAX на сервере - PullRequest
1 голос
/ 10 мая 2019

Использование Entity Framework Core 2.2 У меня следующий запрос:

var user = await context.Users.AsNoTracking()
  .Include(x => x.Lessons).ThenInclude(x => x.LessonLevel)
  .FirstOrDefaultAsync(x => x.Id == userId);

var lessons = context.Lessons.AsNoTracking();
  .Where(x => x.LessonLevelId < user.Lessons.Max(y => y.LessonLevelId));

Таким образом, запрос оценивается локально, и я получаю сообщение:

The LINQ expression 'Max()' could not be translated and will be evaluated locally.'

Как сделать так, чтобы этот запрос оценивался на сервере?

Обновление

Основываясь на ответе DavigG, я заставил его работать, используя:

var maxLessonLevelId = user.Lessons.Max(y => y.LessonLevelId););

var lessons = context.Lessons.AsNoTracking();
  .Where(x => x.LessonLevelId < maxLessonLevelId);

Я знаю, что следующее оценивает локально, но не должно оцениваться на сервере?

var lessons = context.Lessons.AsNoTracking();
  .Where(x => x.LessonLevelId < 
    context.Users.AsNoTracking()
      .Where(y => y.Id == userId)
      .Select(y => y.Lessons.Max(z => z.LessonLevelId))
      .FirstOrDefault());

Можно ли использовать дочерние запросы, которые оцениваются на сервере?

1 Ответ

2 голосов
/ 10 мая 2019

Получить максимальное значение в виде отдельного запроса, например:

var maxLessonLevelId = user.Lessons.Max(y => y.LessonLevelId);

Тогда вы можете получить следующие уроки:

var lessons = context.Lessons.AsNoTracking()
                     .Where(x => x.LessonLevelId < maxLessonLevelId);
...