1

我有一個MySQL數據庫,我試圖用Entity Framework進行查詢。Linq To Entities:針對一組值來檢查多列

我有一個對照表,看起來像這樣:

match_id,winning_hero1,winning_hero2,winning_hero3,winning_hero4,winning_hero5

與winning_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; 
     } 
    } 

是否有一個「更好」的方式去選擇這些比賽嗎?

謝謝。

+0

更好的方法是擁有一個winning_hero集合而不是5個獨立的winning_heros。 – 2013-07-27 01:04:45

+0

您的數據設計錯誤。看看我的答案。 – ataravati

回答

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是不同的。

+0

我通常不會downvote,但這個答案絕對要求一個。你爲什麼不用AND來代替? – ataravati

+0

使用AND,所有的winning_heros必須屬於heroList。這不是用戶想要的。他希望heroList中的所有元素都包含在winning_heros中。 – fcuesta

+0

在這種情況下,英雄列表應該總是有5個英雄,否則它甚至無法檢查所有英​​雄是否在相同的匹配。無論如何,正如我在答覆中提到的那樣,數據設計必須得到修正。 – ataravati

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。