使查询表达式忽略时间并仅过滤日期

时间:2014-08-08 17:27:52

标签: c# linq entity-framework datetime linq-to-entities

我想编写一个查询表达式来返回一些在日期范围内过滤的记录,并忽略时间。

开始日期和结束日期可能匹配(结果为一天)。 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);

2 个答案:

答案 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)

您可以使用DbFunctions.TruncateTime