2013-04-12 29 views
0

我是EF的新手,我認爲有時候更容易犧牲ORM的優勢。但我想知道是否有方法使用EF4來執行此查詢。實體框架4困難的查詢與未映射的屬性

我有datawarehouse事實表。映射看起來像

public class GameResult 
    { 
     [Key] 
     public int GameResultId { get; set; } 

     public virtual Competition Competition { get; set; }  

     public virtual CustomDate DateGame { get; set; }  

     public virtual Contender ContenderFirst { get; set; } 

     public virtual Contender ContenderSecond { get; set; } 

     public virtual Location Location { get; set; } 

     public int ScoreContenderFirst { get; set; } 

     public int ScoreContenderSecond { get; set; } 

     public int PrizeStock { get; set; } 

     public int Budget { get; set; } 

     [NotMapped] 
     public int WinCount { get; set; } 

     [NotMapped] 
     public int FailCount { get; set; } 

     [NotMapped] 
     public int DeadHeatCount { get; set; } 

     [NotMapped] 
     public int CountGames { get; set; } 
    } 

和查詢上sql

select 
    Contenders.Name, 
    sum((Case 
     when (ScoreContenderFirst > ScoreContenderSecond) then 1 
     else 0 
    end)) as wins, 
    sum ((Case 
     when (ScoreContenderFirst = ScoreContenderSecond) then 1 
     else 0 
    end)) as equals, 
    sum((Case 
     when (ScoreContenderFirst < ScoreContenderSecond) then 1 
     else 0 
    end)) as fail, 
    COUNT(GameResults.GameResultId)as countGames 
from GameResults 
inner join Contenders 
on GameResults.ContenderSecond_ContenderId = Contenders.ContenderId 
where GameResults.ContenderFirst_ContenderId = 42 
group by Contenders.Name 
UNION 
select 
    Contenders.Name, 
    sum((Case 
     when (ScoreContenderFirst < ScoreContenderSecond) then 1 
     else 0 
    end)) as wins, 
    sum ((Case 
     when (ScoreContenderFirst = ScoreContenderSecond) then 1 
     else 0 
    end)) as equals, 
    sum((Case 
     when (ScoreContenderFirst > ScoreContenderSecond) then 1 
     else 0 
    end)) as fail, 
    COUNT(GameResults.GameResultId)as countGames 
from GameResults 
inner join Contenders 
on GameResults.ContenderFirst_ContenderId = Contenders.ContenderId 
where GameResults.ContenderSecond_ContenderId = 42 
group by Contenders.Name 

sql查詢手段(我希望得到一個特定的球隊與其他球隊的比賽結果(一些遊戲,特定隊是冠軍,以及特定隊伍放鬆的比賽數量))

+0

也許你能解釋一下你的SQL請求返回,即什麼是它的目標。 – ken2k

+0

爲什麼您將聚合結果存儲在每個單獨的對象中,而不是存儲在不屬於EF模型的另一個特定結果類中? –

+0

@GertArnold我找到兩種方法http://stackoverflow.com/questions/1987836/creating-a-non-mapped-property-in-an-entity-entity-framework和http://stackoverflow.com/questions/5155853 /添加-附加屬性到一個實體框架-4-代碼優先-CTP -5-實體。 ANd決定爲什麼不將彙總結果保存爲[未映射]對象。請提供您的解決方案 – Ray

回答

1
_efContext.GameResult 
      .Where(game => game.ContenderFirst_ContenderId == 42) 
      .Select(game => new { 
        ContendersName = game.ContenderFirst.Name 
        , Win = game.ScoreContenderFirst > game.ScoreContenderSecond 
        , Draw = game.ScoreContenderFirst == game.ScoreContenderSecond 
        , Lose = game.ScoreContenderFirst < game.ScoreContenderSecond 
        }) 
      .GroupBy(game => game.ContendersName) 
      .Select(grp => new { 
        ContendersName= grp.Key 
       , Wins = grp.Where(game => game.Win).Count() 
       , Draws = grp.Where(game => game.Draw).Count() 
       , Loses = grp.Where(game => game.Lose).Count() 
      }) 

不包括countGames,因爲它只是勝利,抽獎的總和並失去。

對於第二個,你可以用這個查詢看起來像第一個連接:

_efContext.GameResult 
      .Where(game => game.ContenderSecond_ContenderId == 42) 
      .Select(game => new { 
       ContendersName = game.ContenderSecond.Name 
       , Win = game.ScoreContenderFirst < game.ScoreContenderSecond 
       , Draw = game.ScoreContenderFirst == game.ScoreContenderSecond 
       , Lose = game.ScoreContenderFirst > game.ScoreContenderSecond 
       }) 
      .GroupBy(game => game.ContendersName) 
      .Select(grp => new { 
       ContendersName= grp.Key 
      , Wins = grp.Where(game => game.Win).Count() 
      , Draws = grp.Where(game => game.Draw).Count() 
      , Loses = grp.Where(game => game.Lose).Count() 
     }) 
+0

請你能查看我上面更新的結果嗎? – Ray

+0

我不明白你想要我做什麼? –

+0

類似這樣的http://img853.imageshack.us/img853/493/selection012m.png – Ray