网上有分组 - 有计数或选择最短日期但 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的字符串。
答案 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.Min
在min
上实施_month
聚合函数,然后使用ParseExact
方法解析为年 - 月组合进行比较。