2011-03-13 92 views
3

在下面的查询中,如何删除detime时间部分的datetime列以获得唯一的日期?linq查询不同日期

using (var ctx = new DBConn()) 
{ 
    var q = ctx.Table.Select(r => r.datetimefield).Distinct(); 
} 
+0

这个问题有正确的答案,你想用EntityFunctions.TruncateTime http://stackoverflow.com/questions/11524853/distinct-date-with-linq – 2013-02-04 09:44:27

回答

10

你绊倒的故障与LINQ到SQL或EF(我不知道哪一个你正在使用)。直接的解决方案是使用DateTime.Date属性,但是,这在两个ORM中都不受支持,它不映射到SQL方法。

有两种解决方法:

  1. 查询急于评价使用ToList

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

+0

这个工作增加了r.datetimefield.Value.Date – user285677 2011-03-13 12:45:16

+0

是的,如果'datetimefield'是一个'可空的',你需要'Value'。但请注意,这会将查询推入内存,这可能需要很长时间才能进行广泛的查询。你应该看看第二点,从长远来看它会为你节省很多麻烦。 – Femaref 2011-03-13 12:46:39

+0

其实,有办法做到这一点,看到这个答案:http://stackoverflow.com/a/11525054/68818 – 2013-02-04 09:44:50

3

假设r.datetimefield是一个DateTime,您可以使用DateTime.Date删除时间部分:

var q = ctx.Table.Select(r => r.datetimefield.Date).Distinct(); 
+0

你不能,至少不能用linq-to-sql或EF作为'Date'属性不映射到SQL方法。 – Femaref 2011-03-13 12:35:31

+0

日期属性可通过value.date但我得到的错误“指定的类型成员'日期'不支持在LINQ to实体” – user285677 2011-03-13 12:39:27

+0

是的,这就是我暗示。您不能在查询中使用Date属性,因为EF不会将其映射到SQL方法。我个人认为这是一个巨大的错误。 – Femaref 2011-03-13 12:40:41