是因为 .net 8 优化了 Contains 子句的 SQL 翻译,之前的 IN 查询有性能问题,在 SQL 中插入常量值会导致许多性能问题,从而造成查询计划缓存失败,并导致不必要地逐出其他查询。 新的 EF Core 8.0 转换使用 SQL Server OPENJSON
函数,以改为将值作为 JSON 数组传输。 这解决了上述技术固有的性能问题:但函数 OPENJSON
在 SQL Server 2014 及更低版本中不可用。
但这个优化只有 SQL Server 2016 及以上版本的数据库支持,否则就会报这个错
而且即便数据库引擎版本达到,数据库本身的兼容性设置如果低于 SQL Server 2016 的话,也会报错
解决方案1:
请通过以下命令检查已配置的数据库兼容性级别:
SQL
SELECT name, compatibility_level FROM sys.databases;
如果查询结果的兼容级别低于 130 (SQL Server 2016),请考虑将数据库兼容性级别调整为130 (SQL Server 2016)或更高版本
如果数据库版本低于SQL Server 2016,那请安装SQL Server 2016或更高的版本。
解决方案2:
在代码中增加兼容性配置项:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseSqlServer(@"<CONNECTION STRING>", o => o.UseCompatibilityLevel(120));