繁体   English   中英

在LINQ to Entities中使用DateTime

[英]Using DateTime in LINQ to Entities

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

数据库包含一个表“users”,其具有“访问”类型的DateTime。

该应用程序被描述为;

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

我试图运行此查询;

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

但是获得异常: NotSupportedException

怎么了?

使用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/

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

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(); 

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM