C# 在LINQ中使用DateTime到实体
我有一个PostgreSQL数据库,它首先通过实体框架代码与程序交互 数据库包含一个表“users”,该表的列“visit”类型为DateTime 该应用被描述为:C# 在LINQ中使用DateTime到实体,c#,datetime,linq-to-entities,C#,Datetime,Linq To Entities,我有一个PostgreSQL数据库,它首先通过实体框架代码与程序交互 数据库包含一个表“users”,该表的列“visit”类型为DateTime 该应用被描述为: public class Users { ... [Required] [Column("visit")] public DateTime VisitDate ... } 我正在尝试运行此查询 var rslt = context.Visitors.Where(v => v.VisitD
public class Users
{ ...
[Required]
[Column("visit")]
public DateTime VisitDate
...
}
我正在尝试运行此查询
var rslt = context.Visitors.Where(v => v.VisitDate.Date == DateTime.Now.Date).ToList()
但是得到一个异常:NotSupportedException
出什么问题了?问题在于LINQ提供程序正在尝试将
DateTime.Now.Date
转换为数据库方法,默认情况下它无法这样做。进行日期比较的诀窍是创建一个时间组件设置为默认值的DateTime
实例。您可以获取更多信息和信息。DateTime。不支持Date
属性。你必须用方法来代替。在生成的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();
使用类EntityFunction修剪时间部分
using System.Data.Objects;
var bla = (from log in context.Contacts
where EntityFunctions.TruncateTime(log.ModifiedDate) == EntityFunctions.TruncateTime(today.Date)
select log).FirstOrDefault();
来源: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);
您可以发布异常的内部详细信息吗?您可以使用
var rslt=context.Visitors.Where(v=>v.VisitDate.Date==DateTime.Now).ToList()
@saravanan我想您的意思可能是DateTime.Today
而不是DateTime.Now
?谢谢您的回答,但我不会再收到异常的支持。但消息包含其他信息:在类型“System.Data.Objects.SqlClient.SqlFunctions”上指定的方法“System.Nullable1[System.Int32]DatePart(System.String,System.Nullable
1[System.DateTime])“无法转换为LINQ到实体存储表达式。可能是PostgreSQL的问题?请参阅下面Tim s的答案,了解使用DbFunctions的最新实现