我有一个查询在通过实体框架执行时不会产生任何结果,但生成的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查询?
答案 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)