1

同じテーブルの親行への情報と参照(列parent_ID)を格納するテーブルがあります。

子レコードの数を含むすべてのレコードのリスト(Linq拡張形式を使用)を取得する必要があります。これは私に必要な情報を与えるSQLクエリです

    Select a.ID, a.Name, Count(b.ID) from Table a
    left join Table b on b.parent_ID=a.ID
    group by a.ID, a.Name

|    ID   | Name     | parent_ID |
----------------------------------
|    1    | First    |   null    |
|    2    | Child1   |    1      |
|    3    | Child2   |    1      |
|    4    | Child1.1 |    2      |

結果は次のようになります。

|    1    | First    |    2      |
|    2    | Child1   |    1      |
|    3    | Child2   |    0      |
|    4    | Child1.1 |    0      |

少なくとも子供を数えようとしましたが、うまくいきません...

    var model = _db.Table 
            .GroupBy(r => new { r.parent_ID })
            .Select(r => new {
                r.Key.parent_ID,
                ChildCount = r.GroupBy(g => g.parent_ID).Count() 
            });

このクエリは、次のようなものと同等ではありません。

    select parent_ID, count(parent_ID) from Table group by Table

ただし、行ごとにcount=1を返します。

linq拡張形式を使用してこのようなクエリを作成するにはどうすればよいですか?

4

1 に答える 1

1

あなたが探しているのは、linq拡張機能の代わりにlinqクエリ構文を使用すると理解しやすいグループ結合です。理解しやすいように、両方のメソッドを投稿します。

IDのテーブルをparent_IDのテーブルに自己結合して、参照整合性を維持するオブジェクトを作成し、匿名オブジェクトを選択して親を選択し、次にすべての子を選択します。

これは、ストレートLINQクエリ構文を使用しています。

    var model = from t1 in _db.Test1
                join t2 in _db.Test1 on t1.ID equals t2.parent_ID into c1
                select new {Parent = t1, Children = c1};

そして、これがLINQ拡張機能を使用したコードです

    var model2 = _db.Test1.GroupJoin(_db.Test1, 
                     t1 => t1.ID, 
                     t2 => t2.parent_ID,
                     (t1, c1) => new {Parent = t1, Children = c1});

一緒に投げたクイックテストプログラムを使用して、両方の方法のテキストボックスに結果を投稿しましたが、コードは同じだったので、一度だけ投稿します。

    foreach (var test in model)
    {
        textBox1.AppendTextAddNewLine(String.Format("{0}: {1}", 
                                      test.Parent.Name, 
                                      test.Children.Count()));
    }

そして、これらのテストの両方の結果は以下で同じでした:

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0
于 2013-02-12T18:50:49.480 に答える