如何在Lambda表达式中判断CreatedDate为空时用备选日期做范围查询
问题:日期查询中字段为空时的替代逻辑处理
我原本通过CreatedDate字段筛选指定日期范围内的记录,但导入旧数据后部分记录无CreatedDate值,导致这部分记录无法被返回。需求是:当CreatedDate为空时,改用PlannedStartDate替代进行日期范围判断。
原代码
mainTables = mainTables.Where(d => d.n.CreatedDate >= AdminSearchVm.AdminSearch.SubmittedFrom && d.n.CreatedDate <= AdminSearchVm.AdminSearch.SubmittedTo);
我尝试的错误代码
mainTables = mainTables.Where(d => d.n.CreatedDate == null ? d.n.PlannedStartDate : d.n.CreatedDate >= AdminSearchVm.AdminSearch.SubmittedFrom && d.n.CreatedDate == null ? d.n.PlannedStartDate : d.n.CreatedDate <= AdminSearchVm.AdminSearch.SubmittedTo);
正确实现方案
可以使用**null合并运算符??**简化逻辑,先确定要用于判断的日期值,再统一做范围校验:
mainTables = mainTables.Where(d => // 优先用CreatedDate,为空则用PlannedStartDate var targetDate = d.n.CreatedDate ?? d.n.PlannedStartDate; targetDate >= AdminSearchVm.AdminSearch.SubmittedFrom && targetDate <= AdminSearchVm.AdminSearch.SubmittedTo);
如果你的环境不支持在Lambda表达式中直接声明变量,也可以写成:
mainTables = mainTables.Where(d => (d.n.CreatedDate ?? d.n.PlannedStartDate) >= AdminSearchVm.AdminSearch.SubmittedFrom && (d.n.CreatedDate ?? d.n.PlannedStartDate) <= AdminSearchVm.AdminSearch.SubmittedTo);
逻辑说明
d.n.CreatedDate ?? d.n.PlannedStartDate:当CreatedDate不为null时取其值,否则使用PlannedStartDate- 之后统一判断该目标日期是否在
SubmittedFrom到SubmittedTo的范围内,逻辑清晰且避免重复判断 - 注意:如果使用EF等ORM框架,需确认
??运算符是否被支持(EF Core、EF6均支持,会转译为SQL的ISNULL或COALESCE函数)
内容的提问来源于stack exchange,提问作者JohnNewbie
相关产品推荐
相关产品推荐

