在linq中以(asc | desc)顺序排序到SQL Server以不同方式处理DateTime

时间:2015-01-09 12:51:45

标签: c# sql-server linq entity-framework

我目前正在尝试将订单添加到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
  • Entity Framework 5.0.0
  • SQL Server 2012 Standard

非常感谢

2 个答案:

答案 0 :(得分:2)

您不会显示您的linq查询,但会立即想到两件事。首先,SQL Server有自己的全球化设置,其次,如果日期是参数化的(linq应该总是这样做),你不应该关心日期字符串格式。

答案 1 :(得分:0)

所以我遇到的问题与SQL或EF无关,事实证明Mvc就是问题所在。我没有将Web.Config中的文化设置为不变文化(' en')。这导致过滤条件(在本例中为ProcessorStartTime)被解析为美国日期字符串,因为如果配置中没有设置区域性,.NET似乎默认为en-US(请参阅此{{3} })。

在我尝试对结果集进行排序之前,我没有看到这一点。我们在排序按钮上创建了一个新的MvcHtmlString链接,其中包含ProcessorStartTime的过滤条件。这解析了日期字符串并颠倒了日期和月份。当我点击链接时,它会被解析回DateTime,因为它会向下传递到LINQ,因此导致排序没有返回任何结果(有关mvc' s日期处理的更多信息{{3 }}

OrderByDescending()正在工作的原因是,排序按钮是关闭| asc | desc之间的切换,因此它将日期和月份重新转换回原来的状态!

为了将来参考,请确保您在网络配置中已设置此设置。我将此标记为副本,因为它对SO来说并不新鲜。感谢所有发布的人(特别是你的Cylon,它指出了我正确的方向^^)