【问题标题】:Linq to Sql - DateTime Format - YYYY-MMM (2009-Mar)Linq to Sql - 日期时间格式 - YYYY-MMM(2009 年 3 月)
【发布时间】:2009-03-10 22:52:08
【问题描述】:

我想编写一个 Linq to Sql 查询,它按用户名和日期时间进行计数和分组。我希望 DateTime 的格式类似于“YYYY-MMM”(即 2009-Mar)。

我认为这可行,但 Linq to Sql 无法解析 ToString“格式”参数。

            dc.MyTable
              .GroupBy(r => new
              {
                  Name = r.UserName,
                  YearMonth = r.SomeDateTime.ToString("yyyy-MMM")
              })
              .Select(r => new
              {
                  Name = r.UserName,
                  YearMonth = r.YearMonth,
                  Count = r.Count()
              })
              .OrderBy(r => r.YearMonth)
              .ThenBy(r => r.Name);

有人有什么想法/建议吗?

谢谢。

【问题讨论】:

  • 顺便说一句 - 如果您愿意,您实际上可以使用查询语法而不是流利/扩展方法来编写它。但是,如果您对当前代码感到满意,请保持“原样”...
  • 我实际上更喜欢扩展/lambda 语法而不是查询语法。只是个人喜好。

标签: c# sql-server linq


【解决方案1】:

我想知道你是否不应该这样做“漫长”的方式......

          dc.MyTable
          .GroupBy(r => new
          {
              Name = r.UserName,
              Year = r.SomeDateTime.Year,
              Month = r.SomeDateTime.Month
          })
          .Select(r => new
          {
              Name = r.UserName,
              Year = r.Year,
              Month = r.Month,
              Count = r.Count()
          })
          .OrderBy(r => r.Year)
          .ThenBy(r => r.Month)
          .ThenBy(r => r.Name);

如果您需要将格式设置为字符串,请稍后在 UI 中执行此操作。通过重构 DateTime 等,或使用 CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(...)

【讨论】:

  • 不是我“想要”的答案,但我认为可能是最正确的。感谢您提供有关使用 DateTimeFormat.GetMonthName(...) 的提示。
【解决方案2】:

我会避免在数据库中将任何内容转换为字符串。按r.SomeDateTime.Yearr.SomeDateTime.Month 分组,按年份、月份和名称排序,分别选择年份和月份(连同计数),然后如果您需要在客户端代码中以字符串格式进行投影.

顺便说一句,我怀疑您的第二个 OrderBy 应该是 ThenBy - 目前 Name 实际上是您订购的最重要的东西。

【讨论】:

  • 好吧,你今天对我的评价是 +71 - 我怀疑你会活下来;-p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多