1

Entity Framework でクエリを実行しようとしている MySQL DB があります。

次のようなマッチ テーブルがあります。

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())
{
  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();
}

これは、すべての wining_heros が異なることを前提としています。

于 2013-07-27T01:02:48.597 に答える
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 が必要です。次に、3 番目のテーブル (MatchHero ) 2 つのテーブル間に多対多の関係を作成するだけです。MatchHero テーブルには、MatchID と HeroID があります。

于 2013-07-27T01:09:56.310 に答える