我想知道在多對多關係中使用三個表時,如何實現與導航屬性相同的功能。通過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)而不使用子查詢?
而不是'table1','table2','table3'爲什麼不是'game','gameGenre','genre'? – Jodrell 2013-02-13 11:31:31
您是否在項目中使用EF或Linq到SQL生成的類? – 2013-02-13 11:48:37
對於我的實際代碼是的,我使用EF,但後端是一個緊湊的SQL數據庫,它似乎不支持外鍵...我想在Entity模型中創建關聯,但是這個問題只是給我帶來了困擾。 ;) – reSPAWNed 2013-02-13 11:51:32