我在Entity Framework中的where子句中使用date并收到以下错误:
这是由于以下代码:
var entity = dbContext.MyTable
.Where(w => w.PId = 3 && w.CreatedOn.Date == mydate.Date)
.First();
如果我使用.ToList()
将数据转换为列表,然后与日期进行比较,它将正常工作但如果我这样做,那么它将首先将数据拉入代码然后将其过滤掉。请帮我解决这个问题。目前我正在使用存储过程来解决问题,但我真的希望它能够正常工作。
答案 0 :(得分:12)
您可以像这样使用DbFunctions.TruncateTime规范函数
var entity = dbContext.MyTable
.Where(w => w.PId == 3 && DbFunctions.TruncateTime(w.CreatedOn) == mydate.Date)
.First();
答案 1 :(得分:1)
EF目前不支持将LINQ中对象的所有粒度操作转换为SQL查询(这是在ToList()操作之前发生的事情)。有些东西(比如原始集合上的.Contains())。但不是所有的事情。
因此,虽然您可能希望查询转换为SQL语句中的各种“DATEPART”比较,但它不受支持。您必须更改LINQ才能适应它。
一种方法是评估24小时范围。这将在ToList()的任一侧工作:
DateTime minDate = new DateTime(mydate.Date.Year, mydate.Date.Month, mydate.Date.Second);
DateTime maxDate = minDate.AddSeconds(86399);
var entity = dbContext.MyTable
.Where(w => w.PId = 3 && w.CreatedOn >= minDate && w.CreatedOn <= maxDate).First();
答案 2 :(得分:1)
您无法使用.Date
直接比较日期,因此您必须使用DbFunctions
或EntityFunctions
。
我更喜欢使用DbFunctions
您可以按照以下说明使用它:
var entity = dbContext.MyTable
.Where(w => w.PId = 3 && DbFunctions.TruncateTime(w.CreatedOn) == DbFunctions.TruncateTime(mydate))
.First();
答案 3 :(得分:0)
这就是我结束日期搜索的结果,我不得不考虑时间(小时和分钟部分)
var entity = dbContext.MyTable
.Where(
x => x.CreatedOn.Year == mydate.Year
&& x.CreatedOn.Month == mydate.Month
&& x.CreatedOn.Day == mydatee.Day
&& x.CreatedOn.Hour == mydate.Hour
&& x.CreatedOn.Minute== mydate.Minute
).FirstOrDefault();