【问题标题】:The LINQ expression cannot be translated on Grouping无法在 Grouping 上翻译 LINQ 表达式
【发布时间】:2022-02-15 18:58:31
【问题描述】:

我有 LINQ 表达式来获取前 15 个最常用的答案

这是表达式

 var latestAnswers = await _dbContext.TextAnswers.Include(x => x.CompanySurvey).ThenInclude(x => x.Survey)
        .Where(x => x.CompanySurvey.Survey.FiscalYear == 2022)
        .GroupBy(x => x.Answer)
        .OrderByDescending(g => g.Count())
        .Take(15)
        .ToListAsync();

但我得到了这个错误

LINQ 表达式 'DbSet() .Include(x => x.CompanySurvey) .ThenInclude(x => x.Survey) .Where(x => x.CompanySurvey.Survey.FiscalYear == (int?)2022 ) .GroupBy(x => x.Answer) .OrderByDescending(g => g .AsQueryable() .Count()) .Take(__p_0)' 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

我不明白为什么不能翻译。

我该如何解决这个问题?

【问题讨论】:

  • EF Core 哪个版本?不要忘记指定。 EF Core 6 支持此类查询。
  • 我看到项目使用 Z.EntityFramework.Plus.EfCore 包 - 6.13.7 @SvyatoslavDanyliv
  • Z 项目不是 EF Core,它只是扩展。
  • 所以 EFCore 6.0.0 在项目@SvyatoslavDanyliv 中使用
  • 您是否尝试删除Includes?还是最后需要相关数据?

标签: c# asp.net linq asp.net-core


【解决方案1】:

EF Core 6 必须支持此类查询,但看起来完整的实现支持已移至 EF Core 7

对话后看起来不需要从数据库中获取分组记录,而只是分组键和计数

var latestAnswers = await _dbContext.TextAnswers
    .Where(x => x.CompanySurvey.Survey.FiscalYear == 2022)
    .GroupBy(x => x.Answer)
    .Select(g => new { Answer = g.Key, Count = g.Count() })
    .OrderByDescending(x => x.Count)
    .Take(15)
    .ToListAsync();

【讨论】:

  • 谢谢你的帮助
【解决方案2】:

我这样重写我的代码

 var latestAnswersQuery = await _dbContext.TextAnswers
        .Include(x => x.CompanySurvey).ThenInclude(x => x.Survey)
        .Where(x => x.CompanySurvey.Survey.FiscalYear == 2022)
        .ToListAsync();

    var latestAnswers = latestAnswersQuery.GroupBy(x => x.Answer).OrderByDescending(g => g.Count()).Take(15);
    return latestAnswers;

现在一切都很好

【讨论】:

  • 这很糟糕,因为您已经将不需要的数据加载到内存中。
  • 好的,那我怎样才能做得更好呢? @SvyatoslavDanyliv
  • 准备答案。两个问题。 1) 您是否需要包含(已加载相关数据) 2) 为什么您的查询返回IGrouping?这是要求吗?
  • 1) 是的,我需要,因为FiscalYear,即在相关表中 2) 这是因为我需要按Answer 字段对所有答案进行分组并返回Answer 字段和@ 的计数987654326@值@SvyatoslavDanyliv
  • 如果你只使用FiscalYear作为过滤器,你不需要Include
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2021-11-27
  • 2022-10-20
  • 2021-03-01
  • 2020-09-29
相关资源
最近更新 更多