在 linq to SQL 服务器中按 (asc|desc) 排序服务器以不同方式处理 DateTime
Order by (asc|desc) in linq to SQL Server handles DateTime differently
我目前正在尝试向将按 EF 对象中的日期时间字段排序的 LINQ 查询添加排序依据:
return this.SortingDirection.Equals("asc", StringComparison.InvariantCultureIgnoreCase) ? entities.OrderBy(e => e.ProcessStartTime) : entities.OrderByDescending(e => e.ProcessStartTime);
当 SortingDirection
设置为 desc
时,它工作正常。但是当设置为 asc
我没有记录!
查看 SQL Server Profiler 后,发现 DateTime
对象的格式不同!
对于DESC
:
ORDER BY [Project1].[StartTime] DESC',N'...@p__linq__22='2015-01-07 09:00:23',@p__linq__23='2015-01-07 09:00:23',@p__linq__24='2015-01-07 09:05:30',@p__linq__25='2015-01-07 09:05:30'
和 ASC
:
ORDER BY [Project1].[StartTime] ASC',N'...@p__linq__22='2015-07-01 09:00:23',@p__linq__23='2015-07-01 09:00:23',@p__linq__24='2015-07-01 09:05:30',@p__linq__25='2015-07-01 09:05:30'
日期和月份已互换,导致 sql 查询 return 没有结果。
这对我来说表明 IQueryable.OrderBy()
方法没有使用正确的本地格式/与 OrderByDescending()
不同的格式,这可能是 EF 中的错误吗?
我的连接字符串中是否有我可以添加的东西来强制执行这个或我可以按这些日期排序的其他方式?
我的设置:
- .NET 4.5
- 实体框架 5.0.0
- SQL 服务器 2012 标准版
非常感谢
您没有显示您的 linq 查询,但立即想到两件事。首先,SQL 服务器有自己的全球化设置,其次,如果日期是参数化的(linq 应该始终这样做),则您不需要关心日期字符串格式。
所以我遇到的问题与 SQL 或 EF 无关,事实证明 Mvc 是问题所在。我没有将 Web.Config
中的文化设置为不变文化 ('en')。这导致过滤条件(在本例中为 ProcessorStartTime
)被解析为美国日期字符串,因为如果在配置中未设置区域性,.NET 似乎默认为 en-US(请参阅此 question).
直到我尝试对结果集进行排序时,我才看到这一点。我们在排序按钮上创建一个新的 MvcHtmlString
link,其中包含 ProcessorStartTime
的过滤条件。这解析了日期字符串并反转了日期和月份。当我单击 link 时,它会被解析回 DateTime
原样,这会向下流到 LINQ,因此导致排序 return 没有结果(有关 mvc 日期的更多信息处理 in this question.
OrderByDescending()
起作用的原因是排序按钮是关闭|asc|desc 之间的一个切换开关,所以它会把几天和几个月恢复到原来的样子!
为了将来参考,请确保您已在您的网络配置中设置此设置。我将把它标记为重复,因为它对 SO 来说并不是什么新鲜事。谢谢大家发帖(尤其是你赛昂,它给我指明了正确的方向^^)
我目前正在尝试向将按 EF 对象中的日期时间字段排序的 LINQ 查询添加排序依据:
return this.SortingDirection.Equals("asc", StringComparison.InvariantCultureIgnoreCase) ? entities.OrderBy(e => e.ProcessStartTime) : entities.OrderByDescending(e => e.ProcessStartTime);
当 SortingDirection
设置为 desc
时,它工作正常。但是当设置为 asc
我没有记录!
查看 SQL Server Profiler 后,发现 DateTime
对象的格式不同!
对于DESC
:
ORDER BY [Project1].[StartTime] DESC',N'...@p__linq__22='2015-01-07 09:00:23',@p__linq__23='2015-01-07 09:00:23',@p__linq__24='2015-01-07 09:05:30',@p__linq__25='2015-01-07 09:05:30'
和 ASC
:
ORDER BY [Project1].[StartTime] ASC',N'...@p__linq__22='2015-07-01 09:00:23',@p__linq__23='2015-07-01 09:00:23',@p__linq__24='2015-07-01 09:05:30',@p__linq__25='2015-07-01 09:05:30'
日期和月份已互换,导致 sql 查询 return 没有结果。
这对我来说表明 IQueryable.OrderBy()
方法没有使用正确的本地格式/与 OrderByDescending()
不同的格式,这可能是 EF 中的错误吗?
我的连接字符串中是否有我可以添加的东西来强制执行这个或我可以按这些日期排序的其他方式?
我的设置:
- .NET 4.5
- 实体框架 5.0.0
- SQL 服务器 2012 标准版
非常感谢
您没有显示您的 linq 查询,但立即想到两件事。首先,SQL 服务器有自己的全球化设置,其次,如果日期是参数化的(linq 应该始终这样做),则您不需要关心日期字符串格式。
所以我遇到的问题与 SQL 或 EF 无关,事实证明 Mvc 是问题所在。我没有将 Web.Config
中的文化设置为不变文化 ('en')。这导致过滤条件(在本例中为 ProcessorStartTime
)被解析为美国日期字符串,因为如果在配置中未设置区域性,.NET 似乎默认为 en-US(请参阅此 question).
直到我尝试对结果集进行排序时,我才看到这一点。我们在排序按钮上创建一个新的 MvcHtmlString
link,其中包含 ProcessorStartTime
的过滤条件。这解析了日期字符串并反转了日期和月份。当我单击 link 时,它会被解析回 DateTime
原样,这会向下流到 LINQ,因此导致排序 return 没有结果(有关 mvc 日期的更多信息处理 in this question.
OrderByDescending()
起作用的原因是排序按钮是关闭|asc|desc 之间的一个切换开关,所以它会把几天和几个月恢复到原来的样子!
为了将来参考,请确保您已在您的网络配置中设置此设置。我将把它标记为重复,因为它对 SO 来说并不是什么新鲜事。谢谢大家发帖(尤其是你赛昂,它给我指明了正确的方向^^)