EF Core为何将short类型集合参数化为JSON格式?
EF Core中集合参数被序列化为JSON的原因
你在.NET 8 RC2的EF Core中遇到的集合被当作JSON处理的情况,是EF Core 8引入的集合参数优化特性导致的,具体细节如下:
优化的背景与目的
此前EF Core处理Contains这类集合查询时,会把集合里的每个元素单独生成为SQL参数(比如@p0=117, @p1=116, @p2=98)再拼入IN子句。但这种方式存在明显局限:
- 当集合元素数量超过SQL Server默认的参数上限(2100个)时,会直接抛出异常;
- 不同元素数量的同逻辑查询会生成不同SQL语句,无法复用查询计划,降低缓存效率。
.NET 8的EF Core针对该问题做了优化:当集合元素数量超过默认阈值(4个)时,会自动将集合序列化为JSON字符串作为单个参数传递,再通过OPENJSON解析成数据集供IN/NOT IN子句使用。这种方式既规避了参数数量限制,又能让同逻辑的查询复用相同的SQL模板,提升整体性能。
恢复旧行为的方式
如果需要回到之前将每个元素作为单独参数的处理方式,可通过两种途径关闭该优化:
全局关闭
在DbContext的OnConfiguring方法中配置:
optionsBuilder.UseSqlServer("<你的连接字符串>", options => options.DisableCollectionParameterOptimization());
单个查询关闭
仅针对当前查询禁用优化:
_ordersQuery = _ordersQuery.Where(x => !stationIds.Contains(x.StationNo)) .DisableCollectionParameterOptimization();
内容的提问来源于stack exchange,提问作者Gaz83
相关产品推荐
相关产品推荐

