Entity framework core 在服务器上使用MAX计算EF查询

Entity framework core 在服务器上使用MAX计算EF查询,entity-framework-core,linq-to-entities,entity-framework-core-2.2,Entity Framework Core,Linq To Entities,Entity Framework Core 2.2,使用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

使用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));
如何在服务器上计算此查询

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());
更新

根据DavigG的回答,我使用以下方法使其工作:

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

var lessons = context.Lessons.AsNoTracking();
  .Where(x => x.LessonLevelId < maxLessonLevelId);
var maxlesonlevelid=user.Lessons.Max(y=>y.LessonLevelId););
var lessons=context.lessons.AsNoTracking();
.其中(x=>x.LessonLevelId
我知道以下内容在本地计算,但不应该在服务器上计算

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());
var-lessons=context.lessons.AsNoTracking();
.其中(x=>x.LessonLevelId<
context.Users.AsNoTracking()
.Where(y=>y.Id==userId)
.Select(y=>y.Lessons.Max(z=>z.LessonLevelId))
.FirstOrDefault());

是否可以使用在服务器上求值的子查询?

将最大值作为单独的查询获取,例如:

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());
var maxLessonLevelId = user.Lessons.Max(y => y.LessonLevelId);
然后你可以得到这样的教训:

var lessons = context.Lessons.AsNoTracking()
                     .Where(x => x.LessonLevelId < maxLessonLevelId);
var-lessons=context.lessons.AsNoTracking()
.其中(x=>x.LessonLevelId
您可以通过单独的查询获得最大值(即
var maxlesonlevelid=user.Lessons.max(y=>y.LessonLevelId);
)我不确定是否理解您的答案。。。我想获取LessonLevelId小于所有用户课程的最大LessonLevelId的所有课程。是的,您可以在第二个查询中使用
maxLessonLevelId
,而不是
user.lessons.Max(y=>y.LessonLevelId)
。@MiguelMoura这是可能的,但这是另一个问题。答案就在这里。简而言之,您应该使用
Max
@IvanStoev的null重载谢谢!这就解决了这个问题,无需定义maxLessonLevelId。我将检查哪一个是更好的选择。附带问题:有没有办法像我在更新时那样使用在服务器上计算的子查询?我知道我贴的那张没有。只是好奇。。。