2017-05-05 62 views
0

我有三个表在我的数据库游戏,角色和播放器。在游戏和角色之间我有角色和玩家之间的多对多关系。我在游戏和玩家之间也有一对多的关系。我已经使用实体框架来映射我的表格。 我想要实现的是让所有玩家在特定的gameID和roleID下玩。查询与linq c的多对多关系#

public IList<Game> GetGamesRolePlayer(int? gameID, int? roleID) 
    { 

     using (DbContextdb = new DbContext()) 
     { 
      db.Configuration.ProxyCreationEnabled = false; 

      if (gameID.HasValue && !roleID.HasValue) 
      { 
       var query1 = (from g in db.Game.Include(r => r.Role) 
           where g.ID == gameID 
           select g).ToList(); 
       _games = query1; 
       return _games; 

      } 
      if (gameID.HasValue && roleID.HasValue) 
      { 
       var query2 = (from g in db.Game 
           from r in db.Role.Include(p => p.Player) 
           where g.ID == game && r.ID == roleID 
           select g).ToList(); 
       _games = query2; 
       return _games; 
      } 
      var query = from game in db.Game select game; 
      _games = query.Include(r => r.Role).ToList(); 
      return _games; 
     } 
    } 
+1

您需要玩家或游戏吗? – octavioccl

+0

int不能为空... –

+0

我有可选参数,这是我可以使它工作的唯一方法:) –

回答

0

我虽然你需要的球员,但你的代码告诉另一件事。如果您需要游戏,可以使用导航属性构建以下查询:

using (DbContextdb = new DbContext()) 
{ 
     db.Configuration.ProxyCreationEnabled = false; 
     IQueryable<Game> query=db.Game.Include(g=>g.Roles); 

     if (gameID.HasValue) 
      query=query.Where(g=>g.ID==gameID.Value) 

     if (roleID.HasValue) 
      query=query.Include(g=>g.Roles.Select(r=>r.Players)) 
         .Where(g=>g.Roles.Any(r=>r.ID==roleID.Value)) 

     return query.ToList(); 
}