【问题标题】:Order by (asc|desc) in linq to SQL Server handles DateTime differentlylinq to SQL Server 中的 Order by (asc|desc) 以不同方式处理 DateTime
【发布时间】:2015-01-09 12:51:44
【问题描述】:

我目前正在尝试将 order by 添加到 LINQ 查询中,该查询将按 EF 对象中的 datetime 字段进行排序:

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 标准版

非常感谢

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    在我尝试对结果集进行排序之前,我没有看到这一点。我们在排序按钮上创建一个新的MvcHtmlString 链接,其中包括ProcessorStartTime 的过滤条件。这会解析日期字符串并反转日期和月份。当我点击链接时,它会被解析回DateTime,这会流向LINQ,因此导致排序不返回任何结果(有关mvc日期处理in this question的更多信息。

    OrderByDescending() 工作的原因是排序按钮是关闭|asc|desc 之间的切换按钮,因此它将天数和数月重新反转为应有的状态!

    为了将来参考,请确保您已在 Web 配置中设置了此设置。我将把它标记为重复,因为它对 SO 来说并不新鲜。感谢所有发帖的人(尤其是赛隆,它为我指明了正确的方向^^)

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2020-02-19
      • 1970-01-01
      • 2014-08-25
      • 2011-04-22
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      相关资源
      最近更新 更多