4

在多对多关系中使用三个表时,我想知道如何完成与导航属性相同的操作。

首先我有一些测试代码让我们开始:

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)?

4

2 回答 2

4

也许您只想将第二个查询与group by

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是一个匿名类型的列表 where Gameis a thing fromtable1并且Genres是一个来自 的事物列表table3

于 2013-02-13T11:31:05.607 回答