4

多対多の関係で3つのテーブルを使用する場合、ナビゲーションプロパティと同じことをどのように実現するのか疑問に思いました。

まず、開始するためのテストコードがいくつかあります。

var table1 = new[]
{
    new { Title = "Title1", Id = 1 },
    new { Title = "Title2", Id = 2 },
    new { Title = "Title3", Id = 3 }
};
var table2 = new[]
{
    new { GameId = 1, GenreId = 1 },
    new { GameId = 1, GenreId = 2 },
    new { GameId = 1, GenreId = 3 },
    new { GameId = 2, GenreId = 1 },
    new { GameId = 2, GenreId = 2 },
    new { GameId = 3, GenreId = 1 }
};
var table3 = new[]
{
    new { Name = "Genre1", Id = 1 },
    new { Name = "Genre2", Id = 2 },
    new { Name = "Genre3", Id = 3 }
};

たとえば、「table1」にはゲームのタイトルがいくつか含まれ、「table3」にはいくつかのジャンルが含まれ、「table2」は「table1」と「table3」をIDで結合します。

さて、私の質問は、ゲームのリスト(table1)をどのように最もエレガントに選択し、それぞれのジャンルのリスト(table3)を匿名タイプのリストに入れるかということです。

これまでの私の解決策はこれです:

var query =
    from t1 in table1
    select new
    {
        Game = t1,
        Genres =
        (
            from t2 in table2
            join t3 in table3 on t2.GenreId equals t3.Id
            where t2.GameId == t1.Id
            select t3
        ).ToList()
    };
var result = query.ToList();

理想的にはサブクエリを避けたいのですが、問題はこの状況で回避できるかどうかです...

私はこのようなことを考えていました:

var query =
    from t1 in table1
    join t2 in table2 on t1.Id equals t2.GameId
    join t3 in table3 on t2.GenreId equals t3.Id
    select new { Game = t1, Genres = t3 };
var result = query.ToList();

もちろん、これは6つのアイテムを返しますが、これは私が望む結果ではありません。

要約すると、LINQで、サブクエリを使用せずに、それぞれのジャンルのリスト(table3)を持つリストゲーム(table1)を選択することは可能ですか?

4

2 に答える 2

4

group by2 番目のクエリを:と組み合わせたいだけかもしれません。

var query =
    from t1 in table1
    join t2 in table2 on t1.Id equals t2.GameId
    join t3 in table3 on t2.GenreId equals t3.Id
    group t3 by t1 into g
    select new { Game = g.Key.Title, Genres = g.Select (x => x.Name) };

ここに画像の説明を入力

注:明らかなはずですがselect new { Game = g.Key.Title, Genres = g.Select (x => x.Name) }、説明のために使用しました。実際のタイプを選択するには、を使用しますselect new { Game = g.Key, Genres = g }

于 2013-02-13T11:29:16.147 に答える
2

使用group:

var query =
    from t1 in table1
    join t2 in table2 on t1.Id equals t2.GameId
    join t3 in table3 on t2.GenreId equals t3.Id
    group t3 by t1 into g
    select new { Game = g.Key, Genres = g.ToList() };

var result = query.ToList();

は匿名result型のリストであり、Gameは からのものでtable1あり、Genresは からのもののリストですtable3

于 2013-02-13T11:31:05.607 に答える