LINQ查询MySQL出现BIGINT UNSIGNED值越界问题求助
解决MySQL无符号整数取反导致的BIGINT UNSIGNED溢出问题
问题根源:validity_months是无符号SMALLINT类型,MySQL中无符号整数无法存储负数,当EF Core生成validity_months * -1时,会先执行乘法运算,直接触发无符号数溢出错误,后续的CAST转换无法提前规避报错。
正确的LINQ写法
要让EF Core生成先转换为有符号整数、再取反的SQL,而非先运算再转换。通过显式转换字段类型后取反即可实现:
var query = db.table_1 .AsNoTracking() .Include(b => b.table_2) .ThenInclude(t => t.table_3) .Where(e => e.Date <= DateTime.UtcNow.AddMonths(e.table_2.ValidityMonths)) .Where(e => e.Date >= DateTime.UtcNow.AddMonths(-Convert.ToInt32(e.table_2.ValidityMonths)));
生成的SQL变化
修改后EF Core会生成如下WHERE条件,先将无符号字段转为有符号再取反,彻底避免溢出:
WHERE (`s`.`date` <= DATE_ADD(UTC_TIMESTAMP(), INTERVAL CAST(`s0`.`validity_months` AS signed) month)) AND (`s`.`date` >= DATE_ADD(UTC_TIMESTAMP(), INTERVAL -CAST(`s0`.`validity_months` AS signed) month));
关于EF Core的问题
这确实属于EF Core的设计疏漏:它没有针对无符号整数的取反操作做特殊处理,默认生成了先运算再转换的SQL,导致MySQL抛出溢出错误。你可以在EF Core官方仓库提交issue反馈该场景。
内容的提问来源于stack exchange,提问作者CiucaS
相关产品推荐
相关产品推荐

