如何通过LINQ比较没有时间的DateTime?

我有

var q = db.Games.Where(t => t.StartDate >= DateTime.Now).OrderBy(d => d.StartDate); 

但是它比较了DateTime时间部分。 我真的不需要它。

如何没有时间做到这一点?

谢谢!

只需使用Date属性即可:

 var today = DateTime.Today; var q = db.Games.Where(t => t.StartDate.Date >= today) .OrderBy(t => t.StartDate); 

请注意,我已经明确地评估了DateTime.Today 一次,以便查询是一致的 – 否则每次执行查询时,甚至执行过程中, Today可能会改变,所以您会得到不一致的结果。 例如,假设您有以下数据:

 Entry 1: March 8th, 8am Entry 2: March 10th, 10pm Entry 3: March 8th, 5am Entry 4: March 9th, 8pm 

当然,无论条目1和3都应该在结果中,或者他们都不应该…但是如果您评估DateTime.Today并且在执行前两个检查之后更改为3月9日,则可以结束条目1, 2,4。

当然,使用DateTime.Today假定您对当地时区的date感兴趣。 这可能是不合适的,你应该确保你知道你的意思。 例如,您可能需要使用DateTime.UtcNow.Date 。 不幸的是, DateTime是一个滑溜的野兽 …

编辑:您可能还想完全摆脱对DateTime静态属性的调用 – 他们使代码很难unit testing。 在野田时间,我们有一个专门为此目的的接口( IClock ),我们希望能够适当地注入这个接口。 有一个“系统时间”的生产实施和一个“存根”实施testing,或者你可以自己实现它。

当然,你可以使用相同的想法,而不使用Noda Time。 要unit testing这段特定的代码,你可能想要传入date,但是你会从某个地方得到它 – 注入时钟意味着你可以testing所有的代码。

LINQ to Entities不支持Date属性 – 如果您尝试在LINQ to Entities查询中的DateTime字段上使用它,则会出现错误。 但是,您可以使用DbFunctions.TruncateTime方法修剪date。

在这种情况下,当然,这并不重要,因为修剪date仍然是> =今天的date,不pipe是否包含时间分量。 如果你不得不做一个<=,那么你会想要做这样的事情:

 var today = DateTime.Today; var q = db.Games.Where(t => DbFunctions.TruncateTime(t.StartDate) <= today); 

试试这个代码

 var today = DateTime.Today; var q = db.Games.Where(t => DbFunctions.TruncateTime(t.StartDate) <= today); 

恰巧LINQ不喜欢像DateTime.Date这样的属性。 它只是不能转换为SQL查询。 所以我想出了一个用Jon的答案比较date的方法,但没有那个调皮的DateTime.Date 。 像这样的东西:

var q = db.Games.Where(t => t.StartDate.CompareTo(DateTime.Today) >= 0).OrderBy(d => d.StartDate);

这样,我们比较一个完整的数据库date时间,与所有的date和时间的东西,如2015-03-04 11:49:45000或类似的东西,用一个DateTime代表当天的实际第一毫秒,就像2015-03-04 00:00:00.0000

我们与DateTime.Today比较的任何DateTime都会安全的返回给我们,如果这个date晚一些的话。 除非你想在同一天进行比较,在这种情况下,我认为你应该去凯撒的答案。

DateTime.CompareTo()方法只是一个面向对象的东西。 如果参数早于引用的date时间,则返回-1;如果LITERALLY EQUAL(具有所有这些时间性的东西),则返回0;如果它晚,则返回1。

我发现在我的情况下,这是唯一的工作方式:(在我的应用程序中,我想删除旧的日志条目)

  var filterDate = dtRemoveLogs.SelectedDate.Value.Date; var loadOp = context.Load<ApplicationLog>(context.GetApplicationLogsQuery() .Where(l => l.DateTime.Year <= filterDate.Year && l.DateTime.Month <= filterDate.Month && l.DateTime.Day <= filterDate.Day)); 

我不明白为什么乔恩的解决scheme不工作….

尝试

 var q = db.Games.Where(t => t.StartDate.Date >= DateTime.Now.Date).OrderBy(d => d.StartDate); 
 DateTime dt=DateTime.Now.date; var q = db.Games.Where( t =>EntityFunction.TruncateTime(t.StartDate.Date >=EntityFunction.TruncateTime(dt)).OrderBy(d => d.StartDate );