我有过
var q = db.Games.Where(t => t.StartDate >= DateTime.Now).OrderBy(d => d.StartDate);
但它将DateTime
的时间部分包括在内进行了比较.我真的不需要它.
How to do it without time?
非常感谢.
我有过
var q = db.Games.Where(t => t.StartDate >= DateTime.Now).OrderBy(d => d.StartDate);
但它将DateTime
的时间部分包括在内进行了比较.我真的不需要它.
How to do it without time?
非常感谢.
只需使用Date
属性:
var today = DateTime.Today;
var q = db.Games.Where(t => t.StartDate.Date >= today)
.OrderBy(t => t.StartDate);
请注意,我已经显式地计算了DateTime.Today
、once,因此查询是一致的-否则,每次执行查询时,甚至within执行时,Today
都可能发生变化,因此您会得到不一致的结果.例如,假设您有以下数据:
Entry 1: March 8th, 8am
Entry 2: March 10th, 10pm
Entry 3: March 8th, 5am
Entry 4: March 9th, 8pm
当然,结果中应该有both个条目1和3,或者应该有neither个条目.但是,如果在执行前两次判断后判断DateTime.Today
和changes,直到3月9日,您可能会得到条目1、2、4.
当然,使用DateTime.Today
假设你对local时区的日期感兴趣.这可能不合适,你应该确保你知道自己的意思.例如,你想用DateTime.UtcNow.Date
来代替.不幸的是,DateTime
is a slippery beast...
编辑:您可能还希望完全摆脱对DateTime
个静态属性的调用——它们使代码难以进行单元测试.在Noda Time中,我们有一个专门用于此目的的接口(IClock
),我们希望适当地注入该接口.有一个用于生产的"系统时间"实现和一个用于测试的"存根"实现,或者您可以自己实现.
当然,不用野田佳彦,你也可以使用同样的 idea .要对这段特定的代码进行单元测试,您可能希望传递日期,但您将从somewhere获得它——注入时钟意味着您可以测试all段代码.