1

我有一个 MySQL 数据库,我正在尝试使用实体框架进行查询。

我有一个看起来像这样的匹配表:

match_id、wining_hero1、wining_hero2、wining_hero3、wining_hero4、wining_hero5

一个由整数标识的wining_hero。

给定一个英雄ID列表,我想返回所有这些英雄都在获胜队伍中的比赛。

像这样的东西:

public List<MatchEntity> GetAllMatchesWithWinningHeroes(List<int> heroList)
    {
        List<MatchEntity> matchList = null;
        using (var context = new dotaEntities())
        {
            switch (heroList.Count)
            {
                case 1:
                    matchList = context.MatchEntities.Where(m => m.winning_hero1 == heroList[0]
                                                                 || m.winning_hero2 == heroList[0]
                                                                 || m.winning_hero3 == heroList[0]
                                                                 || m.winning_hero4 == heroList[0]
                                                                 || m.winning_hero5 == heroList[0]).ToList();
                    break;
                case 2:
                    matchList = context.MatchEntities.Where(m => (m.winning_hero1 == heroList[0]
                                                                 || m.winning_hero2 == heroList[0]
                                                                 || m.winning_hero3 == heroList[0]
                                                                 || m.winning_hero4 == heroList[0]
                                                                 || m.winning_hero5 == heroList[0])
                                                                 && (m.winning_hero1 == heroList[1]
                                                                 || m.winning_hero2 == heroList[1]
                                                                 || m.winning_hero3 == heroList[1]
                                                                 || m.winning_hero4 == heroList[1]
                                                                 || m.winning_hero5 == heroList[1])).ToList();
                    break;
                case 3:
                    //etc..
            }

            return matchList;
        }
    }

有没有一种“更好”的方式来选择这些比赛?

谢谢你。

4

2 回答 2

0

你需要的是这样的:

using (var context = new dotaEntities())
{
  var matchList = context.MatchEntities.Where(m => 
    heroList.Contains(m.winning_hero1) &&
    heroList.Contains(m.winning_hero2) && 
    heroList.Contains(m.winning_hero3) && 
    heroList.Contains(m.winning_hero4) && 
    heroList.Contains(m.winning_hero5)).ToList();
}

但是,您的数据设计是错误的。在您的 Match 表中,您应该只有一个 MatchID (PK),可能还有 MatchName 或 MatchDate,而在您的 Hero 表中,您应该有 HeroID (PK)、HeroName,... 然后,您应该有第三个表(MatchHero ) 只是为了在两个表之间创建多对多关系。在您的 MatchHero 表中,您将拥有 MatchID 和 HeroID。

于 2013-07-27T01:09:56.310 回答
0

我认为这就是你想要的:

using (var context = new dotaEntities())
{
  matchList = context.MatchEntities.Where(m=> 
    ( heroList.Contains(m.winning_hero1)?1:0 + 
      heroList.Contains(m.winning_hero2)?1:0 +
      heroList.Contains(m.winning_hero3)?1:0 +
      heroList.Contains(m.winning_hero4)?1:0 +
      heroList.Contains(m.winning_hero5)?1:0
    ) == heroList.Count
  ).ToList();
}

这假设所有winning_heros 都是不同的。

于 2013-07-27T01:02:48.597 回答