2014-07-21 64 views
3

沒有與組由例子 - 具有計數選擇在網絡上最小日期LINQ,但我無法找到特定的解決方案對於我的問題。而且我也沒有先進的linq理解來結合我迄今發現的這些解決方案。LINQ與GROUP BY和與民(串)HAVING子句

我有一個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的字符串。

回答

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

having子句在此LINQ語句Where內實現。經client_id分組後,我們用x.Min實現min集合函數_month,然後用ParseExact方法解析爲年 - 月組合進行比較。

從OP提供的SQLFiddle,返回4條記錄。 A demo使用相同的數據,上述查詢也返回相同的4條記錄。

+1

感謝編輯@Pieter Geerkens –

+0

爲什麼要從字符串解析左日期時間而不是直接構造它? – abatishchev

+0

@abatishchev夠公平的,也可以直接完成。我會更新我的答案,以包括這一點。 '_month'是我理解的一個字符串,因此必須進行解析。 –