【发布时间】: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.WinCount。GameResult有两个竞争者,那么是谁呢?而GameResult大约是1场比赛,算一场比赛是什么意思?所以我的意思是:属性不应该放在首位,你需要一个聚合的结果类。这不是如何处理未映射的属性的问题。
标签: c# entity-framework-4 union data-warehouse