Force Entity Framework以'yyyy-mm-dd'格式生成带有DateTime的SQL查询

时间:2015-06-02 15:50:11

标签: sql-server entity-framework entity-framework-6

我有一个查询在通过实体框架执行时不会产生任何结果,但生成的SQL会产生1个结果

这是EF查询

    var fd = fromdate.ToUniversalTime();
    var td = todate.ToUniversalTime();

   var schedulesToSelect = db.SP_Schedule.Where(s => s.SP_ActiveSchedule.Active 
                           && channelIds.Contains(s.ChannelID)
                           && DbFunctions.TruncateTime(s.ScheduleTXDateTimeStart) >= fd               
                           && DbFunctions.TruncateTime(s.ScheduleTXDateTimeStart) < td)
                         .Select(s => s.ScheduleID).ToList();

当我在SSMS中通过db.Database.Log = s=> Debug.Write(s);运行SQLgenerated

导致此

SELECT 
[Extent1].[ScheduleID] AS [ScheduleID]
FROM  [dbo].[SP_Schedule] AS [Extent1]
INNER JOIN [dbo].[SP_ActiveSchedule] AS [Extent2] ON [Extent1].[ScheduleID] = [Extent2].[ScheduleID]
WHERE ([Extent1].[ChannelID] IN (25)) AND ([Extent2].[Active] = 1)
AND ((convert (datetime2, convert(varchar(255), [Extent1].[ScheduleTXDateTimeStart], 102) ,  102)) >= @p__linq__0) 
AND ((convert (datetime2, convert(varchar(255), [Extent1].[ScheduleTXDateTimeStart], 102) ,  102)) < @p__linq__1)
-- p__linq__0: '04/04/2015 23:00:00' (Type = DateTime2, IsNullable = false)
-- p__linq__1: '05/04/2015 23:00:00' (Type = DateTime2, IsNullable = false)

我得到1个结果。

当前的线程文化是“en-GB”,SQL服务器文化是us_english。我知道这是一个DateTime问题,但是我如何强制EF生成一个日期时间为'yyyy-MM-dd'格式的SQL查询?

1 个答案:

答案 0 :(得分:0)

在处理国际化问题时,我经常遇到同样的问题。

我通常做的是重写我的LINQ查询:

DB.somerecords.Where(x=>x.Date.Year == DateParameter.Year 
                     && x.Date.Month == DateParameter.Month 
                     && x.Date.Day == DateParameter.Day)

或者

from res in DB.somerecords where x.Date.Year == DateParameter.Year 
                              && x.Date.Month == DateParameter.Month 
                              && x.Date.Day == DateParameter.Day
select res

与三次单独的比较相关的开销略高,但几乎不可察觉。

从好的方面来说,这是一种更灵活的过滤日期的方式,因为您只能比较年,月,日,小时,分钟,秒或上述任意组合。

您可能还会发现以下方法很有用:

DB.ExecuteQuery<TResult>(string query, params object[] parameters)