Linq按日期查询最大visit_id返回0问题求助
问题排查方案
1 优先排查日期匹配精度问题
这是出现该问题最高频的原因:
- 数据库中
Kashf_date字段存储的是带时分秒的完整datetime类型,你传入的Kashf_date.Value如果是截断了时分秒的日期(比如赋值时只给了年月日,时分秒默认是00:00:00),二者做等值匹配时会直接过滤掉时分秒不相等的记录,导致Where条件实际没有命中任何数据 - 验证方法:执行如下代码看输出结果是否大于0,确认是否真的命中了数据:
var matchCount = db.Table_KASHF.Where(s => s.Kashf_date == Kashf_date.Value).Count(); Console.WriteLine(matchCount);
- 如果确认是日期精度问题,按你的业务需求调整匹配逻辑即可,比如只匹配年月日的话可以改成:
Where(s => s.Kashf_date.Date == Kashf_date.Value.Date)
2 调整查询写法避免逻辑异常
你当前的写法Select后加DefaultIfEmpty再取Max在部分EF版本中会出现翻译异常,甚至会把默认插入的0加入到最大值计算中,推荐改成可空类型取值后再做默认值处理的写法:
// 先查询数据库中的最大值,没有匹配数据时返回null int? dbMax = db.Table_KASHF .Where(s => s.Kashf_date == Kashf_date.Value) .Max(s => (int?)s.Visit_ID); // 空值默认赋值为0 int max = dbMax ?? 0;
3 其他低概率排查点
- 确认
Table_KASHF表中所有符合日期条件的记录的Visit_ID字段值是否本身就全部为0 - 确认
Visit_ID字段的类型映射是否正确,有没有把数据库中的非int类型错误映射为C#的int类型导致取值异常 - 确认你连接的数据库环境是否正确,有没有在测试库查数据、实际跑代码连的是另一个空库的情况
内容的提问来源于stack exchange,提问作者عالم المنوعات
相关产品推荐
相关产品推荐

