【发布时间】:2019-05-11 12:44:39
【问题描述】:
使用 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);) -
我不确定我是否理解了你的答案......我想要获取所有课程级别 ID 小于所有用户课程的最大课程级别 ID 的课程。
-
是的,然后您将在第二个查询中使用
maxLessonLevelId而不是user.Lessons.Max(y => y.LessonLevelId)。 -
@MiguelMoura 这是可能的,但这是一个不同的问题。答案就在这里stackoverflow.com/questions/55815535/…。很快,您应该使用
Max的可空重载。 -
@IvanStoev 谢谢!这解决了它,而无需定义 maxLessonLevelId。我会检查哪个是更好的选择。
标签: entity-framework-core linq-to-entities entity-framework-core-2.2