【问题标题】:Entity Framework 4 difficult query with not mapped property具有未映射属性的实体框架 4 困难查询
【发布时间】:2013-04-12 12:22:35
【问题描述】:

我是EF 的新手,我认为有时候牺牲ORM 的优势更容易。但我想知道是否有办法使用EF4 执行此查询。

我有带有事实表的数据仓库。映射看起来像

    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 查询的意思是(我想获取特定球队与其他球队的比赛结果(特定球队获胜的比赛数量,以及特定球队较松的比赛数量))

【问题讨论】:

  • 也许您可以解释一下您的 SQL 请求返​​回什么,即它的目标是什么。
  • 为什么将聚合结果存储在每个单独的对象中,而不是存储在不属于 EF 模型的另一个特定结果类中?
  • @GertArnold 我找到了两种方法stackoverflow.com/questions/1987836/…stackoverflow.com/questions/5155853/…。并决定为什么不将聚合结果保存为 [Not Mapped] 对象。请提供您的解决方案
  • 我想说的是,将聚合结果存储在构成聚合的对象中是没有意义的。你最终会得到例如GameResult.WinCountGameResult 有两个竞争者,那么是谁呢?而GameResult大约是1场比赛,算一场比赛是什么意思?所以我的意思是:属性不应该放在首位,你需要一个聚合的结果类。这不是如何处理未映射的属性的问题。

标签: c# entity-framework-4 union data-warehouse


【解决方案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()
       })

【讨论】:

  • 我不明白你要我做什么?
  • 我不理解您查询的结果类型
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2015-01-22
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
相关资源
最近更新 更多