Ardalis.Specifications中DateTime比较的异常行为及原因咨询
问题解答
这种情况是正常的,原因和EF Core(Ardalis.Specifications通常基于EF Core实现查询转换)的查询表达式转换逻辑有关:
对于第一段代码
Query.Where(s => s.Id == id && listOfDate.Any(d => d == s.Date)):
EF Core可以识别这种客户端集合与数据库字段的相等匹配逻辑,将其转换为SQL中的IN或EXISTS语句(比如等价于s.Date IN (@d1, @d2, ...)),这类转换是EF Core查询提供器原生支持的,所以能正常执行。对于第二段代码
Query.Where(s => s.Id == id && listOfDate.Any(d => d > s.Date)):
这种逻辑要求判断数据库中的s.Date是否小于集合里的任意一个元素,本质等价于s.Date < listOfDate.Max(),但EF Core的查询提供器无法自动将客户端集合的Any结合大于比较的表达式,转换为有效的SQL语句。因为这类非相等的集合任意匹配操作,没有对应的标准SQL转换规则,EF Core无法解析该表达式,因此会抛出InvalidOperationException提示无法转换查询。
替代解决方案
可以先在客户端计算集合的最大值,再将比较逻辑改为数据库字段与最大值的直接比较,这样就能被EF Core正常转换:
var maxDate = listOfDate.Max(); Query.Where(s => s.Id == id && s.Date < maxDate);
内容的提问来源于stack exchange,提问作者Ares
相关产品推荐
相关产品推荐

