多対多の関係で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)を選択することは可能ですか?