【问题标题】:I want to convert this SQL query to linq using C#我想使用 C# 将此 SQL 查询转换为 linq
【发布时间】:2021-11-29 13:57:39
【问题描述】:

我想在 C# 中将此 SQL 查询转换为 Linq:

select
    count(*),
    FORMAT (CreatedDate, 'MM') as months,
    FORMAT (CreatedDate, 'yyyy') as year
from
    ProviderPosts
group by
    FORMAT (CreatedDate, 'MM'),
    FORMAT (CreatedDate, 'yyyy')

【问题讨论】:

  • 如果没有 EF DbContext 设置,您无法将 SQL 转换为 Linq。您尚未发布有关如何设置实体框架的任何详细信息,因此我们无法为您提供帮助。
  • 另外,SQL Server 中的FORMAT 真的很慢:CONVERT 要快得多(尽管灵活性要低得多),但无论如何你正在做的是最慢的分组方式之一-by-months,而是只使用YEAR( CreatedDate )MONTH( CreatedDate )(因为它们返回int 值)而不使用FORMATCONVERT(也不是CAST)(这是不合适的,因为你在格式化文本时你应该只关心数值)。
  • 我把它改成了month()和year()谢谢你,但是我想把它转换成linQ,你能帮我吗?
  • 我刚刚解释了为什么我们不能帮助你:因为你还没有发布你的DbContext 的详细信息。
  • @Dai 真的吗?将 LINQ 转换为 SQL 的唯一方法是使用 EF?

标签: c# sql asp.net linq


【解决方案1】:

以下代码几乎是您的查询的准确翻译,但根据 LINQ 提供程序的不同,它可能无法将其翻译成 SQL。

from pp in ProviderPosts
group pp by new DateTime(pp.CreatedDate.Year, pp.CreatedDate.Month, 1) into g
select new {
    Count = g.Count(),
    months = g.Key.ToString("MM"),
    year = g.Key.ToString("yyyy"),
}

在 SQL 中,按EOMONTHDATEFROMPARTS 分组比FORMAT 更有效

【讨论】:

  • 我认为在 DateTime 构造函数中使用 var p 而不是 pp 是一个错字。
  • 如果p.CreatedDate 可以为空会发生什么?
  • @Dai 如果是 LINQ to Objects,那么是的,你会遇到问题,但 EF 和 Linq2SQL 只是直接翻译它,SQL 函数在输入 null 时返回 null。 Null 是分组依据的有效值
【解决方案2】:

尽量不要转换成任何东西。使用.Year.Month

var query =
  from pp in ProviderPosts
  group pp by new { pp.CreatedDate.Year, pp.CreatedDate.Month } into g
  select new 
  {
      Count = g.Count(),
      g.Key.Month,
      g.Key.Year,
  }

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多