LINQ查询不同的日期

4
在下面的查询中,如何去除日期时间列的时间部分,以获取仅具有不同日期的结果?
using (var ctx = new DBConn())
{
  var q = ctx.Table.Select(r => r.datetimefield).Distinct();
}

这个问题有正确的答案,你需要使用EntityFunctions.TruncateTime。 - Andrew Barrett
2个回答

14

你可能遇到了linq-to-sql或EF中的一个问题(我不知道你用的是哪个)。直接的解决方案是使用DateTime.Date属性,但是这两个ORM都不支持它,因为它无法映射到SQL方法。

你有两个解决方案:

  1. 通过使用ToList对查询进行急切求值:

  2. var q = ctx.Table.ToList().Select(r => r.datetimefield.Date).Distinct();
    
  3. 在数据库中创建一个只详细日期组件的字段。这是我通常采用的方法,因为您可以留在数据库中并在那里执行查询。


是的,如果 datetimefield 是一个 Nullable<DateTime>,你需要使用 Value。但要注意,这会将查询推入内存,对于大量查询可能需要很长时间。你应该看一下第二点,它会在长期运行中为你节省很多麻烦。 - Femaref
实际上,有一种方法可以做到这一点,请参见此答案:https://dev59.com/0WbWa4cB1Zd3GeqPUTbB#11525054 - Andrew Barrett

4
假设r.datetimefield是一个日期时间类型,你可以使用DateTime.Date函数来去除时间部分:
var q = ctx.Table.Select(r => r.datetimefield.Date).Distinct();

你不能这么做,至少在Linq-to-SQL或EF中不行,因为“Date”属性不能映射到SQL方法。 - Femaref
日期属性可通过 value.date 访问,但我收到错误消息:“在 LINQ to Entities 中不支持指定的类型成员 'Date'”。 - user285677
是的,这就是我在暗示的。你不能在查询中使用Date属性,因为EF不会将其映射到SQL方法。我个人认为这是一个巨大的缺陷。 - Femaref

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接