Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在LINQtoSQL中编写和优化具有一对多关系的三表联接? 理想阶级结构_C#_Sql Server_Linq To Sql - Fatal编程技术网

C# 如何在LINQtoSQL中编写和优化具有一对多关系的三表联接? 理想阶级结构

C# 如何在LINQtoSQL中编写和优化具有一对多关系的三表联接? 理想阶级结构,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,一个游戏有很多玩家,每个玩家都有很多统计数据。换句话说,每个列表包含一个列表,每个玩家包含一个列表 基本表模式 我的尝试 这个解决方案显然没有使用连接,这主要是因为我不确定如何以正确的顺序执行连接以达到预期的结果 我应该提到的是,我们每天新增游戏约10万,玩家约100万,统计数据约3000万。当前查询每秒可以选择约1.4个游戏,并使用99%的超线程四核CPU 如果有任何问题,请随时要求澄清 更新1 这个简单的东西每秒的速度比原来的行快约9K 22倍。SQL Server显然正在使用大约90%的C

一个游戏有很多玩家,每个玩家都有很多统计数据。换句话说,每个列表包含一个列表,每个玩家包含一个列表

基本表模式 我的尝试 这个解决方案显然没有使用连接,这主要是因为我不确定如何以正确的顺序执行连接以达到预期的结果

我应该提到的是,我们每天新增游戏约10万,玩家约100万,统计数据约3000万。当前查询每秒可以选择约1.4个游戏,并使用99%的超线程四核CPU

如果有任何问题,请随时要求澄清

更新1 这个简单的东西每秒的速度比原来的行快约9K 22倍。SQL Server显然正在使用大约90%的CPU完成所有工作。但是,我没有使用嵌套对象,而是使用一维查询


如果您对此更新有任何建议,我很乐意听取

让您的数据库处理部分工作负载似乎更合适,尤其是在您只是运行查询而不是向数据库写入数据的情况下。考虑在数据库中创建实现连接的视图。然后可以查询视图并避免在客户端计算机上加入。您仍然可以使用实体数据模型和LINQ对视图运行查询。通过这种方法,您应该可以看到相当好的性能提升

//Possible SQL for creating the view
CREATE VIEW vw_GameData AS 
SELECT g.GameId, g.Region, p.AccountId, etc...
FROM Game g JOIN Player p ON (g.GameId = p.GameId AND g.Region = p.Region)
JOIN Statistic s ON (s.GameId = p.GameId AND s.RegionId = p.RegionId AND s.AccountId = p.AccountId)

首先尝试一个简单的linq连接


你期望的输出是什么?对于这样的大量数据,我建议在LINQ上进行一次存储过程。好问题-我需要能够迭代每一个游戏,因此需要迭代每一个玩家和统计数据,以便聚合不同类别的每日总数。听起来你在寻找更像多维数据集功能的东西。打开一个聊天室,我会给你一些提示:我想我需要100个声誉来创建一个聊天室。你能邀请我参加一个吗?我在主程序中尝试过类似的方法,它返回的对象数等于统计行数~30M。这很好,如果在SQL Server上完成,可能是最有效的,但我更愿意使用into来完全按照我的布局填充类。Statistics是实名RawStats的友好名称。换句话说,它们是相同的。我只是忘了更新代码以反映语义差异。
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()
         });
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
         });
//Possible SQL for creating the view
CREATE VIEW vw_GameData AS 
SELECT g.GameId, g.Region, p.AccountId, etc...
FROM Game g JOIN Player p ON (g.GameId = p.GameId AND g.Region = p.Region)
JOIN Statistic s ON (s.GameId = p.GameId AND s.RegionId = p.RegionId AND s.AccountId = p.AccountId)
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 t in db.Games
         join t1 in t.Player on t.GameId equals t1.GameId
         join t2 in t.Statistic on t.GameId equals t2.GameId
         select new PlayerGameDTO
         {
            AccountId = t1.AccountId,
            GameId = t1.GameId,
            Region = t1.Region,
            //RawStats <-- what are you trying to do here?
            //RawStats = (from r in db.RawStats
            //where r.AccountId == p.AccountId && r.GameId == p.GameId && r.Region.Equals(p.Region) select r).ToList()
         }).ToList();