我有一个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
怎么了?
答案 0 :(得分: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();
答案 1 :(得分:11)
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();
答案 2 :(得分:3)
问题是LINQ提供程序正在尝试将DateTime.Now.Date
转换为数据库方法,默认情况下它无法执行。进行日期比较的技巧是创建一个DateTime
实例,其时间组件设置为默认值。您可以获得更多信息here和here。
答案 3 :(得分: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);