【问题标题】:LINQ with Group By and Having Clause with Min(string)带有 Group By 和带有 Min(string) 子句的 LINQ
【发布时间】:2014-09-11 11:42:46
【问题描述】:

group by 的示例 - 有计数select minimum date with linq 在网络上,但是我找不到我的问题的特定解决方案。而且我还没有高级 linq 理解来组合我迄今为止发现的这些解决方案。

我有一个这样的 SQL 查询:

select client_id 
from my_table /* Column1 : client_id, Column2 : _month */
group by client_id
having min(_month) = '2009-11'

我的问题是:如何将此查询转换为 c# linq?。 到目前为止,我写了这样的东西,但它并没有给出我必须拥有的东西:

var query = dataTable.AsEnumerable() // This is my_table
  .GroupBy(c => c.Field<Int32>("client_id"))
  .Select(g => new
  {
      g.Key,
      minMonth = g.Min(c => c.Field<string>("_month"))
  })
  .Where(d => d.minMonth == "Some String like '2009-11'");   

它实际上给了我不需要的这个 SQL 的结果:

select client_id, min(_month) 
from my_table 
where _month = '2009-11' 
group by client_id

注意:_month 是一个格式为 YYYY-MM 的字符串。

【问题讨论】:

    标签: c# sql linq having-clause sql-to-linq-conversion


    【解决方案1】:

    试试这个:

    var results = mytable.GroupBy(x => x.client_id)
                         .Where(x => x.Min(y => DateTime.ParseExact(y._month,"yyyy-MM",null))
                                       == new DateTime(2009,11,1))
                         .Select(x=>x.Key);
    

    having 子句在此 LINQ 语句的 Where 内实现。通过client_id分组后,我们使用x.Min_month上实现min聚合函数,然后使用ParseExact方法解析为年月组合进行比较。

    从 OP 提供的SQLFiddle 中,返回了 4 条记录。使用相同数据的demo 与上述查询也返回相同的 4 条记录。

    【讨论】:

    • 为什么要从字符串中解析left datetime而不是直接构造?
    • @abatishchev 很公平,也可以直接完成。我将更新我的答案以包括这一点。 _month 是我理解的字符串,因此必须对其进行解析。
    • 感谢您的快速回复和解释。虽然看起来很有希望,但在编译此解决方案后,我自己的解决方案给出了相同的结果。我期待的是我的第一个 SQL sn-p 的结果,其中 have min(_month) = '2009-11' 子句。
    • 它不给你吗?运行此查询后会得到什么?这是上面的演示:rextester.com/FZYOEQ94595,这是使用相同数据的 SQL 查询的演示:rextester.com/JKE76750
    • 您可以尝试使用实际数据来查看这两个 SQL sn-ps 之间的实际差异。 dropbox.com/s/l1ju4cctrktkty3/…
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2013-01-27
    • 2021-06-06
    相关资源
    最近更新 更多