.NET中List存数据库单列后LINQ查询报错问题
解决EF Core JSON嵌套集合查询翻译错误问题
问题原因
List<T>.Exists()是List的实例方法,并非LINQ标准查询操作符,EF Core无法将其翻译成对应的SQL语句来操作数据库中存储的JSON字段,因此抛出翻译失败的错误。而Any()是LINQ的标准扩展方法,EF Core(5及以上版本)对JSON字段的嵌套集合查询提供了完善的翻译支持。
解决方案1:替换Exists为Any(推荐)
将查询中的Exists替换为Any,修改后的代码如下:
var query = from card in dbContext.Cards where card.Items .Any( c => c.ContentItems.Any(ci => ci.ItemKey != null) ) select card;
这样EF Core可以正确将Any翻译成针对JSON字段的SQL查询(如SQL Server的JSON函数),实现服务器端过滤,性能更优。
解决方案2:客户端评估(不推荐,仅适合小数据量)
如果因特殊需求必须使用Exists,可通过AsEnumerable()先将数据加载到客户端内存再过滤,但这会加载所有Cards数据到本地,性能损耗大,仅适合数据量极小的场景:
var query = from card in dbContext.Cards.AsEnumerable() where card.Items .Exists( c => c.ContentItems.Exists(ci => ci.ItemKey != null) ) select card;
内容的提问来源于stack exchange,提问作者Mu nt
相关产品推荐
相关产品推荐

