2017-05-05 51 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

您已启用延迟加载?如果没有,请尝试启用它。 请注意,延迟加载使用不当会影响应用程序的性能。