2

私は非常に簡単な解決策を期待していますが、私の人生ではこれを理解することはできません...

これに相当するLINQを作成しようとしています:

SELECT Group, COUNT(*) as GroupCount
FROM table1
WHERE Valid > 0
GROUP BY Group, Project

私はこれまでのところこれを持っています:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP, r.Project})
    .Select(r => new{ r.GROUP, GroupCount = r.count()};

クエリの何が問題になっていますか? Visual Studio がスローし、次のようなエラーが表示されます。

System.Linq.IGrouping' には 'GROUP' の定義が含まれておらず、タイプ 'System.Linq.IGrouping' の最初の引数を受け入れる拡張メソッド 'GROUP' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか? )

EDIT:ちょっと注意:上記のエラーは節で与えられr.Groupています。Select

また、count拡張メソッドが存在しないというエラーがスローされますが、この方法で行われた他の例を見てきました。たぶん、古いバージョンの LINQ の例を見ていましたか?

EDIT2:いくつかのサンプルデータ

GroupName    ProjectID    Step    Other Info...
-----------------------------------------------
GroupA     |     1      |   1   | ..............
GroupA     |     1      |   2   |..............
GroupA     |     3      |   1   | ..............
GroupB     |     4      |   1   | ..............
GroupB     |     5      |   1   | ..............
GroupC     |     6      |   1   |..............

望ましい結果:

 GroupName    Group Count
--------------------------- 
GroupA      |     2
GroupB      |     2
GroupC      |     1
4

3 に答える 3

2

さて、.Selectステートメントに次のエラーがあります。

  • .countする必要があります.Count(C# では大文字と小文字が区別されます)
  • r.GROUPr.Keyまたはr.Key.GROUP(.GroupBy() はIGrouping <TKey, TElement> を返します)
  • Select メソッドの最後の括弧を忘れました。(しかし、それは例の単なるタイプミスだったのかもしれません)

結果:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP, r.Project })
    .Select(r => new { r.Key.GROUP, GroupCount = r.Count() });

アップデート:

コメントと質問の更新後。グループごとにグループ化しているだけのように見えるので、要求した出力を生成するには、次のようになります。

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP }) // First, group only on GROUP
    .Select(r => new 
    { 
        r.Key.GROUP, 
        // Second, group on unique ProjectId's
        GroupCount = r.GroupBy(g => g.Project).Count()
    });

または簡略化:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => r.GROUP) // First, group only on GROUP
    .Select(r => new 
    { 
        Group = r.Key, 
        // Second, group on unique ProjectId's
        GroupCount = r.GroupBy(g => g.Project).Count() 
    });

コメントで尋ねたように、はい、値は GroupBy 句で連結されていると言えます。したがってnew { r.GROUP, r.Project }、すべてのペアを同じ値でグループ化します。

于 2012-12-12T18:53:25.983 に答える
1

LINQ クエリでは、大文字と小文字が区別されます。r.GROUPおそらく存在しないにアクセスしようとしています。r.Group代わりに使用してください。r.count()にも変更r.Count()。修正されたコードは次のとおりです。

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.Group, r.Project})
    .Select(r => new{ r.Key, GroupCount = r.Count()};
于 2012-12-12T18:44:34.623 に答える
0

Group By を実行しているときは、新しい匿名型を作成しています (あなたが思っている型ではありません)。したがって、select ステートメントを実行しているときは、一体 GROUP が何であるかがわかりません。

これを軽減するには、ここにある 2 番目の回答に従ってください。

于 2012-12-12T18:46:37.310 に答える