9

我有一个 PostgreSQL 数据库,它通过 Entity Framework Code First 与程序交互。

数据库包含一个表“用户”,其列“访问”类型为 DateTime。

该应用程序被描述为;

public class Users
{    ...
    [Required]
    [Column("visit")]
    public DateTime VisitDate
    ...
}

我试图运行这个查询;

var rslt = context.Visitors.Where(v => v.VisitDate.Date == DateTime.Now.Date).ToList()

但得到一个例外:NotSupportedException

怎么了?

4

4 回答 4

13

使用类 EntityFunction 来修剪时间部分。

using System.Data.Objects;    

var bla = (from log in context.Contacts
           where EntityFunctions.TruncateTime(log.ModifiedDate) ==  EntityFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

资料来源:http ://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

于 2013-05-24T13:42:44.653 回答
11

DateTime.Date不支持属性。您必须改用SqlFunctions.DatePart方法。它将以DATEPART TSQL生成的 SQL 查询中的方法结束。

var rslt = context.Visitors
                  .Where(v => SqlFunctions.DatePart("year", v.VisitDate) == SqlFunctions.DatePart("year", DateTime.Now))
                  .Where(v => SqlFunctions.DatePart("dayofyear", v.VisitDate) == SqlFunctions.DatePart("dayofyear", DateTime.Now))
                  .ToList(); 
于 2013-05-24T13:38:20.047 回答
5

Mayur Borad 的答案(恕我直言,比接受的答案更正确)已过时:

System.Data.Entity.Core.Objects.EntityFunctions已过时。你应该System.Data.Entity.DbFunctions改用。

var today = DateTime.Today; // (Time already removed)

var bla = context.Contacts
    .FirstOrDefault(x => DbFunctions.TruncateTime(x.ModifiedDate) == today);
于 2014-12-13T05:29:48.153 回答
3

问题是 LINQ 提供程序正在尝试转换DateTime.Now.Date为数据库方法,默认情况下它无法做到这一点。进行日期比较的技巧是创建一个DateTime将其时间组件设置为默认值的实例。您可以在此处此处获得更多信息。

于 2013-05-24T13:37:42.643 回答