Bar*_*aya 3 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'
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何将此查询转换为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'");
Run Code Online (Sandbox Code Playgroud)
它实际上给了我这个SQL的结果,我不需要:
select client_id, min(_month)
from my_table
where _month = '2009-11'
group by client_id
Run Code Online (Sandbox Code Playgroud)
注意:_month是一个格式为YYYY-MM的字符串.
试试这个:
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);
Run Code Online (Sandbox Code Playgroud)
该having
子句Where
在此LINQ语句中实现.分组后client_id
,我们使用x.Min
实现min
聚合函数_month
,然后使用该ParseExact
方法解析为年 - 月组合进行比较.
从OP提供的SQLFiddle中,返回了4条记录.甲演示使用相同的数据和上述查询也返回相同的4个记录.