EF Core查询进行中活动报错:运算符<=无法应用于bool与DateTime
解决Linq查询中的连续比较错误
这个报错很典型——C#并不支持像数学表达式那样的连续比较写法,比如a <= b <= c会被编译器解析为(a <= b) <= c。左边的a <= b会返回一个布尔值,接着你试图把这个布尔值和c(DateTime类型)做比较,这就触发了Operator '<=' cannot be applied to operands of type 'bool' and 'DateTime'错误。
另外,你的代码还有一个潜在风险:直接访问DateStart.Value和DateEnd.Value,如果数据库中存在DateStart或DateEnd为null的已发布活动,会抛出NullReferenceException。
修复后的代码
我帮你调整了查询逻辑,同时加入空值安全处理和代码优化:
public async Task<List<EventInfo>> GetOngoingEventsAsync() { // 提取今日日期到变量,避免多次计算,同时让查询更清晰 var today = DateTime.Today; return await _db.EventInfos .Where(i => i.Published && i.DateStart.HasValue // 确保DateStart不为null,避免空引用 && ( // 条件1:活动开始日期就是今天 i.DateStart.Value.Date == today || // 条件2:今天处于活动的开始和结束日期之间,同时确保DateEnd不为null (i.DateEnd.HasValue && i.DateStart.Value.Date <= today && today <= i.DateEnd.Value.Date) )) .OrderBy(s => s.DateStart) .ToListAsync(); }
关键修改点
- 拆分连续比较:把
i.DateStart.Value.Date <= DateTime.Now.Date <= i.DateEnd.Value.Date拆分为两个独立的比较条件,用&&连接:i.DateStart.Value.Date <= today && today <= i.DateEnd.Value.Date。 - 空值安全检查:添加
i.DateStart.HasValue和i.DateEnd.HasValue判断,确保只有当字段不为null时才访问.Value。 - 提取今日变量:将
DateTime.Now.Date替换为DateTime.Today并提前赋值给变量,既简化了代码,也避免了Linq查询中重复计算系统时间的问题。
如果你的业务逻辑能保证所有已发布活动的DateStart都不为null,可以去掉i.DateStart.HasValue的判断,但保留它能让代码更健壮,应对数据库中可能存在的异常数据。
内容的提问来源于stack exchange,提问作者Ole Kristian Losvik
相关产品推荐
相关产品推荐

