LINQ with Group By和Min子句(字符串)

时间:2014-07-21 02:59:07

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

网上有分组 - 有计数选择最短日期 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的字符串。

1 个答案:

答案 0 :(得分:5)

试试这个:

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);

{LIN}语句中的having内实现了Where子句。在按client_id分组后,我们使用x.Minmin上实施_month聚合函数,然后使用ParseExact方法解析为年 - 月组合进行比较。

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