在多对多关系中使用三个表时,我想知道如何完成与导航属性相同的操作。
首先我有一些测试代码让我们开始:
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”通过它们的 id 连接“table1”和“table3”。
现在我的问题是你如何最优雅地选择一个游戏列表(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();
这当然会返回六个项目,这不是我想要的结果。
总结一下:在 LINQ 中是否可以在不使用子查询的情况下选择一个列表游戏(table1),每个游戏都有一个类型列表(table3)?