2013-02-13 64 views
3

我想知道在多對多關係中使用三個表時,如何實現與導航屬性相同的功能。通過LINQ中的接合表將表連接在一起

首先我有一些測試代碼讓我們開始:

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 } 
}; 

「表1」中包含的發言權遊戲比如一些標題,「表3」包含了一些流派,而「表2」加入「表1」與「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(); 

哪個當然返回六個項目,這不是我想要的結果。

所以總結一下:LINQ中有沒有可能選擇一個列表遊戲(table1),每個遊戲都有一個他們的流派列表(table3)而不使用子查詢?

+1

而不是'table1','table2','table3'爲什麼不是'game','gameGenre','genre'? – Jodrell 2013-02-13 11:31:31

+0

您是否在項目中使用EF或Linq到SQL生成的類? – 2013-02-13 11:48:37

+0

對於我的實際代碼是的,我使用EF,但後端是一個緊湊的SQL數據庫,它似乎不支持外鍵...我想在Entity模型中創建關聯,但是這個問題只是給我帶來了困擾。 ;) – reSPAWNed 2013-02-13 11:51:32

回答

3

也許你只是想你的第二個查詢與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) }; 

enter image description here

注:這應該是顯而易見的,但我只是用select new { Game = g.Key.Title, Genres = g.Select (x => x.Name) }用於說明目的選擇實際類型,使用select new { Game = g.Key, Genres = g }

1

使用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是匿名的類型,其中Gametable1Genres的事情是從table3的事情列出的清單。