LINQ日期范围查询如何包含DateTime可空列的null值记录
LINQ适配可空离店日期的入店状态查询实现
筛选规则
指定查询日期后,筛选目标用户当日处于入店状态的记录,判断标准:
- 入店时间
checkedIn早于等于查询日期 - 离店时间
checkedOut为可空DateTime类型:- 有值时需晚于等于查询日期
- 为null代表用户未离店,只要入店时间符合要求即纳入结果
原有LINQ写法未处理checkedOut为null的分支,会遗漏未离店的有效记录。
修正代码
直接在Where子句中补充null值判断逻辑,对齐SQL中ISNULL的处理效果:
// 若需忽略时分秒、仅按日期维度比对,统一取Date属性 var sdate = DateTime.Parse(query.filteredDate.ToString()).Date; var queryResult = table.Where(x => x.id == query.id && sdate >= x.checkedIn.Date && (x.checkedOut == null || sdate <= x.checkedOut.Value.Date) ).ToList();
逻辑说明
- 入店时间判断保持原有规则,要求查询日期不早于入店时间
- 离店时间判断拆分为两个或条件,满足任意一个即可:
checkedOut为null:用户尚未离店,入店时间符合就命中checkedOut不为null:要求查询日期不晚于离店时间,和原有判断逻辑一致
- 时间字段取
.Date的写法,会被ORM翻译为SQL中的日期类型转换函数,和示例SQL中cast(xxx as date)的逻辑完全对齐,避免时分秒精度导致的匹配错误。
结果验证
以测试数据、查询日期2022/06/14、用户ID=111的场景验证:
- checkedIn=2022-06-13、checkedOut=null的记录:满足条件,正常返回
- checkedIn=2022-06-13、checkedOut=2022-06-14的记录:满足条件,正常返回
- ID=758、checkedOut=2022-06-12的记录:用户ID不匹配且离店时间早于查询日期,被过滤
返回结果和示例SQL的预期结果完全一致。
内容的提问来源于stack exchange,提问作者deanpillow
相关产品推荐
相关产品推荐

