5

group byの例があります- Web 上で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 のような形式の文字列です。

4

1 に答える 1

6

これを試して:

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句はWhere、この LINQ ステートメント内に実装されています。でグループ化した後client_id、 を使用して集計関数x.Minを実装し、 メソッドを使用して年月の組み合わせとして解析し、比較を行います。min_monthParseExact

OP が提供するSQLFiddleから、4 つのレコードが返されます。同一のデータと上記のクエリを使用したデモでも、同じ 4 つのレコードが返されます。

于 2014-07-21T03:18:14.640 に答える