在服务器上使用 MAX 评估 EF 查询
Evaluate EF query with MAX on the server
使用 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());
是否可以使用在服务器上计算的子查询?
获取最大值作为单独的查询,例如:
var maxLessonLevelId = user.Lessons.Max(y => y.LessonLevelId);
那么你可以得到这样的教训:
var lessons = context.Lessons.AsNoTracking()
.Where(x => x.LessonLevelId < maxLessonLevelId);
使用 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());
是否可以使用在服务器上计算的子查询?
获取最大值作为单独的查询,例如:
var maxLessonLevelId = user.Lessons.Max(y => y.LessonLevelId);
那么你可以得到这样的教训:
var lessons = context.Lessons.AsNoTracking()
.Where(x => x.LessonLevelId < maxLessonLevelId);