EF Core 5.0 按ID列表查询数据时LINQ表达式无法翻译报错如何解决?
报错原因
- EF Core 5.0 不支持翻译内存本地集合(此处为你定义的
groupId字符串列表)的Any()方法中包含的数据库字段转字符串、拼接运算逻辑,找不到对应的SQL语法可以映射该运算,因此抛出无法翻译的异常。 - 你将传入的分组ID拆成了字符串类型列表,但数据库中
FK_Group是数值类型,强制转换为字符串和本地集合匹配的逻辑不在EF Core的可翻译规则范围内。
解决方案
最优方案(数据库端执行,性能最佳)
提前将本地的分组ID列表转换为和数据库字段类型匹配的数值类型,使用EF Core原生支持的Contains方法完成匹配,该方法可以直接翻译为SQL的IN语句,支持走索引查询性能最优。
修改后代码如下:
// 第一步:将拆分后的字符串转成和FK_Group匹配的数值类型 List<int> groupId = request.GroupId.Split(',').Select(int.Parse).ToList(); var result = ENTITIES.ProductGroup .Where(p => p.IsDisplay) .Where(p => p.FK_GroupNavigation.IsDisplay) // 直接用Contains匹配,EF可直接翻译为SQL .Where(p => groupId.Contains(p.FK_Group ?? 0)) .ToList();
备选方案(客户端计算,仅适合数据量极小的场景)
如果你确实需要保留字符串匹配的逻辑,可以在过滤内存集合之前调用AsEnumerable()显式将数据拉到客户端执行计算,但该方案会把前两个Where过滤后的所有数据都加载到内存中再做匹配,数据量大时性能极差不推荐使用。
修改后代码如下:
List<string> groupId = request.GroupId.Split(',').ToList(); var result = ENTITIES.ProductGroup .Where(p => p.IsDisplay) .Where(p => p.FK_GroupNavigation.IsDisplay) // 显式切换到客户端计算 .AsEnumerable() .Where(p => groupId.Any(g => g == (p.FK_Group ?? 0) + "")) .ToList();
内容的提问来源于stack exchange,提问作者Mohamad Hasan Salmaaniyaan
相关产品推荐
相关产品推荐

