【问题标题】:Using DateTime in LINQ to Entities在 LINQ to Entities 中使用 DateTime
【发布时间】:2013-05-24 13:33:49
【问题描述】:

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

数据库包含一个表“users”,其中列“visit”类型为 DateTime。

应用程序被描述为;

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

我试图运行这个查询;

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

但遇到异常:NotSupportedException

怎么了?

【问题讨论】:

  • 你能发布你的异常的内部细节吗?
  • 你可以使用var rslt = context.Visitors.Where(v => v.VisitDate.Date == DateTime.Now).ToList()
  • @saravanan 我想你的意思可能是Datetime.Today 而不是DateTime.Now

标签: c# datetime linq-to-entities


【解决方案1】:

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

【讨论】:

  • 请参阅下面 Tim S 的回答,了解使用 DbFunctions 的最新实现
【解决方案2】:

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

【讨论】:

  • 感谢您的回答,但我再次收到 NotSupportedException。但消息包含其他信息:“System.Data.Objects.SqlClient.SqlFunctions”类型上的指定方法“System.Nullable1[System.Int32] DatePart(System.String, System.Nullable1[System.DateTime])”无法转换为 LINQ to Entities 存储表达式。也许是 PostgreSQL 的问题?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多