在 linq to SQL Server 中,Order by (asc|desc) 以不同的方式处理 DateTime
本文关键字:desc DateTime 处理 方式 asc Server SQL to linq by Order | 更新日期: 2023-09-27 18:36:50
我目前正在尝试将顺序添加到 LINQ 查询中,该查询将按 EF 对象中的日期时间字段排序:
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 查询不返回任何结果。
这对我来说表明IQueryable.OrderBy()
方法没有使用正确的本地格式/不同的格式来OrderByDescending()
,这可能是EF中的错误吗?
我的连接字符串中是否有一些内容可以强制执行此内容或按这些日期排序的其他方式?
我的设置:
- .NET 4.5
- 实体框架 5.0.0
- SQL Server 2012 标准
非常感谢
您不显示 linq 查询,但会立即想到两件事。首先,SQL Server 有自己的全球化设置,其次,如果日期是参数化的(linq 应该始终这样做),则无需关心日期字符串格式。
所以我遇到的问题与SQL或EF无关,事实证明Mvc是问题所在。我没有将Web.Config
中的区域性设置为固定区域性("en")。这导致过滤条件(在本例中为 ProcessorStartTime
)被解析为美国日期字符串,因为如果配置中未设置区域性,.NET 似乎默认为 en-US(请参阅此问题)。
直到我尝试对结果集进行排序,我才看到这一点。我们在排序按钮上创建了一个新的MvcHtmlString
链接,其中包含ProcessorStartTime
的过滤条件。这将解析日期字符串并反转日期和月份。当我单击链接时,它会解析回一个DateTime
,因为它向下渗透到 LINQ,因此导致排序不返回任何结果(有关此问题中 mvc 日期处理的更多信息。
OrderByDescending()
工作的原因是排序按钮是关闭|asc|desc之间的切换,因此它将几天和几个月重新反转到应有的状态!
为了将来参考,请确保您在 Web 配置中已设置此设置。我会将其标记为重复项,因为它对 SO 来说并不新鲜。谢谢大家发帖的人(尤其是你 Cylon,它为我指明了正确的方向^^)