【问题标题】:Evaluate EF query with MAX on the server在服务器上使用 MAX 评估 EF 查询
【发布时间】: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 =&gt; y.LessonLevelId);
  • 我不确定我是否理解了你的答案......我想要获取所有课程级别 ID 小于所有用户课程的最大课程级别 ID 的课程。
  • 是的,然后您将在第二个查询中使用 maxLessonLevelId 而不是 user.Lessons.Max(y =&gt; y.LessonLevelId)
  • @MiguelMoura 这是可能的,但这是一个不同的问题。答案就在这里stackoverflow.com/questions/55815535/…。很快,您应该使用 Max 的可空重载。
  • @IvanStoev 谢谢!这解决了它,而无需定义 maxLessonLevelId。我会检查哪个是更好的选择。

标签: entity-framework-core linq-to-entities entity-framework-core-2.2


【解决方案1】:

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

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

那么你可以像这样学习:

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

【讨论】:

  • 一个附带问题:有什么方法可以使用在服务器上评估的子查询,就像我在更新时所做的那样?我知道我发布的那个没有。只是好奇......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2017-07-22
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多