Entity Framework Core中Where语句中的枚举类型问题

3
我不断收到有关此代码片段(一致性类型是枚举)的实体框架错误:
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(
source: DbSet,
predicate: (e) => Any(
source: (Unhandled parameter: __consistency_0),
predicate: (y) => (int)y == (int)e.Consistency))'
无法被翻译。请将查询重写为可翻译的形式,或通过插入对AsEnumerable()AsAsyncEnumerable()ToList()ToListAsync()的调用来显式地切换到客户端评估。


3
Consistency 的定义是什么?EF 如何编写将一个值转换为 int 的 SQL 查询语句? - David Browne - Microsoft
抱歉,我没有明确说明这个一致性的东西是 Consistency 类型的,它是一个枚举值。我的错误! - Michał J. Gąsior
尝试过使用 .Where(x => consistency.Contains(x.Consistency)) 吗?在3.1版本中,这适用于整数数组的SQL转换,但还没有尝试过枚举类型。 - joakimriedel
不,但我会的 :) 谢谢你的建议! - Michał J. Gąsior
2
另外,如果您使用的版本是3.0,最好升级到3.1预览版,因为3.0在LINQ查询方面存在很多问题,而这些问题在2.2.x中是可以正常工作的。 - joakimriedel
1个回答

4
当实体框架查询执行时,它会被翻译成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 查询翻译器混淆了? - Michał J. Gąsior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接