我想编写一个查询表达式来返回一些在日期范围内过滤的记录,并忽略时间。
开始日期和结束日期可能匹配(结果为一天)。 EF似乎总是将时间附加到生成的SQL查询中,这让我疯狂。
在使用带有EF的查询表达式时,是否有办法在DateTime上过滤时忽略Time组件?
表达式查询:
searchQuery = searchQuery.Where(currentQuery => currentQuery.Ticket.th_TicketDate >= startDate && currentQuery.Ticket.th_TicketDate <= endDate);
执行此操作会返回0结果,因为EF包含时间00:00:00,如下所示:
Select * from t_TicketHeader
Where th_TicketDate >= '2014-08-01 00:00:00'
AND th_TicketDate <= '2014-08-01 00:00:00'
然而,如果我直接编写并运行我自己的SQL查询(将结束日期提前一天):
Select * from t_TicketHeader
Where th_TicketDate >= '2014-08-01'
AND th_TicketDate <= '2014-08-02'
我检索了我的2个预期结果:
th_TicketNumber th_TicketDate
OT01938332 2014-08-01 06:00:00.000
OT01938333 2014-08-01 06:00:00.000
我目前的解决方案是转换我的日期标准,将时间推到一天结束,但这个解决方案似乎有点 hacky :
startDate = new DateTime(searchCriteria.StartDate.Year, searchCriteria.StartDate.Month, searchCriteria.StartDate.Day);
endDate = new DateTime(searchCriteria.EndDate.Year, searchCriteria.EndDate.Month, searchCriteria.EndDate.Day, 23, 59, 59);
答案 0 :(得分:3)
这个怎么样,关键是修改结束日期。
var formattedEndDate = endDate.Date.AddDays(1).AddMilliseconds(-1);
searchQuery = searchQuery.Where(currentQuery =>
currentQuery.Ticket.th_TicketDate >= startDate.Date
&& currentQuery.Ticket.th_TicketDate <= formattedEndDate);
或者
var formattedEndDate = endDate.Date.AddDays(1);
searchQuery = searchQuery.Where(currentQuery =>
currentQuery.Ticket.th_TicketDate >= startDate.Date
&& currentQuery.Ticket.th_TicketDate < formattedEndDate);
// ^^^ remove the equal sign
答案 1 :(得分:2)