【问题标题】:Any on enums inside of Where in Entity Framework CoreAny on enums inside Where in Entity Framework Core
【发布时间】:2020-01-28 17:31:27
【问题描述】:

我在这段代码的 sn-p 上不断收到实体框架错误(一致性类型是枚举):

IQueryable<Examination> examinationsSet = _context.Examinations;

if (consistency.Length > 0)
{
    examinationsSet = examinationsSet
                          .Where(x => consistency.Any(y => (int)y == (int)x.Consistency));
}

我尝试在一致性和Any 之间添加AsQueryableAsEnumerable,但这没有帮助。这是我得到的主要错误:

System.InvalidOperationException: „LINQ 表达式 'Where(
来源:数据库集,
谓词:(e) => Any(
来源:(未处理的参数:__consistency_0),
谓词:(y) => (int)y == (int)e.Consistency))'
无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

【问题讨论】:

  • Consistency的定义是什么? EF 应该如何编写将一个转换为int 的 SQL?
  • 对不起,我还没有澄清这个一致性的东西是一致性类型,它是一个枚举值。我的错!
  • 试过 .Where(x => 一致性.Contains(x.Consistency)) ?在 3.1 中为 int 数组转换为 SQL,但尚未尝试使用 enum。
  • 不,但我会 :) 谢谢你的建议!
  • 另外,如果这是 3.0,你最好升级到 3.1 预览版本,因为 3.0 对过去在 2.2.x 中工作的 LINQ 查询有很多麻烦

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


【解决方案1】:

当实体框架查询执行时,它被转换为 SQL。 最好在查询之外做尽可能多的逻辑以避免混淆翻译者。

试试这样的:

List<int> consistencyNumbers = consistency.Select(item => (int)item).ToList();  
IQueryable<Examination> examinationsSet = consistencyNumbers.Count > 0
    ? _context.Examinations.Where(x => consistencyNumbers.Any(y => y == (int)x.Consistency))
    : _context.Examinations;

【讨论】:

  • 所以我有这个枚举数组转换的事实让 EF 查询翻译器感到困惑?
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多