2017-05-05 57 views
0

我在兩個表格遊戲和角色之間有多對多的關係。將表與實體框架進行映射時,表示表關係的表未映射。 目前我正試圖從數據庫中使用LINQ提取特定遊戲下的所有遊戲角色,但我正在爲我的方法的返回類型而苦苦掙扎。查詢與linq c的多對多關係#

有沒有不同的解決方案,我目前試圖用我的代碼實現?

public List<Game> GetGamesRole(int? gameID) 
    { 
     using (DbContext db = new DbContext()) 
     { 
      if (!gameID.HasValue && !roleID.HasValue) 
      { 
       var query = from game in db.Game select game; 
       _games = query.ToList(); 
       return _games; 
      } 
      else if (gameID.HasValue) 
      { 
       var query = db.Game.Join(db.Role, game => game.ID, role => role.ID, 
        (game, role) => new { Game = game, Role = role }).Where(gameRole => gameRole.Game.ID == gameID).ToList(); 
       _games = query.ToList<Game>(); 

      } 

     } 

    } 

回答

0

如果已使用的EntityFramework映射的關係,你不需要做手工的加入,EF會爲你做的;假設你在遊戲上有類似public List<Role> Roles {get;set;}的東西,當你查詢時你只需要.Include(g => g.Roles),那麼每個遊戲都會有其填充的角色列表。

手動執行連接也可以,但您可能需要執行GroupJoin。但讓框架幫助你,就像我上面描述的那樣,要容易得多。

+0

我的遊戲類包含角色列表,是的。我想你的建議,但我不知道這是正確的做法,因爲我似乎並沒有得到角色 'VAR QUERY1 = db.Game.Include(「角色」)。如果(x => x.ID == gameID).ToList(); _games = query1.ToList (); return _games;' –

+0

嘗試使用允許指定lambda的Include重載,這會使查看任何錯誤變得更容易。我認爲包含參數需要是屬性的名稱,所以如果屬性名稱是「角色」。但是,再次使用lambda會迫使你正確地做到這一點。 –

+0

我試圖使用這一行代碼,但仍然不返回角色 var query1 = db.Game.Where(x => x.ID == gameID).Include(g => g.Role).ToList( )' –

0

我有點生疏,所以如果這是不正確的,不理這個答案。

但這不正是您的查詢的問題:

db.Game.Join(db.Role, game => game.ID, role => role.ID, 
        (game, role) => new { Game = game, Role = role }).Where(gameRole => gameRole.Game.ID == gameID).ToList(); 

沒有返回一個類型「遊戲」對象列表?畢竟,你正在做一個加入。 我看到你正試圖通過Linq表達式中的這種方式來命名返回類型「遊戲」,但我不認爲它完全符合你的期望。 由於一個類已經被定義爲「遊戲」,所以這會相互衝突。特別是因爲兩個不同的類沒有定義相同。 嘗試將返回類型分解爲不同的方法,看看是否不能解決您的問題。

可以生成一個包含所有信息但不需要全部信息的類。或者爲每個案例生成兩種不同的方法,因此每種方法都有一個單獨的返回類型......這就是我會做的。

0

您已啓用延遲加載?如果沒有,請嘗試啓用它。 請注意,延遲加載使用不當會影響應用程序的性能。