理想的班级结构
一个游戏有很多玩家,每个玩家都有很多统计数据。换句话说,每个都List<Game>
包含 aList<Player>
并且每个都Player
包含 a List<Statistic>
。
Game -> Player1 -> Statistic1
....
Statistic30
....
Player10 -> Statistic1
....
Statistic30
基本表架构
Game
----
GameId (int)
Region (nvarchar(4))
Player
------
GameId (int)
Region (nvarchar(4))
AccountId (int)
Statistic
---------
GameId (int)
Region (nvarchar(4))
AccountId (int)
我的尝试
var b = (from g in db.Games
select new GameDTO()
{
GameId = g.GameId,
Players = (from p in db.PlayerGames
where p.GameId == g.GameId && p.Region.Equals(g.Region)
select new PlayerGameDTO()
{
AccountId = p.AccountId,
GameId = p.GameId,
Region = p.Region,
Statistics = (from r in db.Statistics
where r.AccountId == p.AccountId && r.GameId == p.GameId && r.Region.Equals(p.Region)
select r).ToList()
}).ToList()
});
该解决方案(显然)不使用Join
,主要是因为我不确定如何以Join
正确的顺序执行 s 以获得所需的结果。
我应该提一下,我们每天汇总约 10 万新游戏、约 100 万玩家和约 3000 万统计数据。当前查询每秒可以选择约 1.4 个游戏,并使用 99% 的超线程四核 CPU。
如果有什么不清楚的地方,请随时要求澄清。
更新#1
var d = (from g in db.Games
join p in db.PlayerGames on new { g.GameId, g.Region } equals new { p.GameId, p.Region }
join r in db.Statistics on new { p.GameId, p.Region, p.AccountId } equals new { r.GameId, r.Region, r.AccountId }
select new StatisticsDTO()
{
GameId = r.GameId,
AccountId = r.AccountId,
StatType = r.StatType,
Value = r.Value
});
这么简单的事情就是每秒产生约 9K(比原来快 22 倍)行。SQL Server 显然正在使用约 90% 的 CPU 完成所有工作。但是,我留下的是一维查询,而不是嵌套对象。
如果您对此更新有任何建议,我很想听听。