【发布时间】:2017-03-15 00:31:13
【问题描述】:
我正在编写一个跟踪在线射击游戏统计数据的服务。客户端向服务器报告事件,然后将这些事件记录在 SQL Server 数据库中。服务器应生成从客户端报告汇总的游戏事件报告 - 事件声明的真实性基于报告它的客户端数量。
我有一个 Linq-to-SQL 查询,它根据发生的时间(7 秒内)对来自不同客户端的事件报告进行分组。
Events
.Select(e =>
Events.Where(ev =>
// Same event type
ev.Discriminator == e.Discriminator &&
// Same match
ev.ServerIpAddress == e.ServerIpAddress &&
SqlMethods.DateDiffSecond(ev.MatchStartTime, e.MatchStartTime) < 30 &&
// Find nearby events
Math.Abs(ev.MatchTime.TotalSeconds - e.MatchTime.TotalSeconds) < 7 &&
// That are duplicate
ev.VictimTribesGuid == e.VictimTribesGuid &&
ev.KillerTribesGuid == e.KillerTribesGuid &&
ev.KillType == e.KillType &&
ev.Weapon == e.Weapon
)
)
这将返回以下内容:
事件按预期分组,但由于外部查询是“每个事件”,所以组是重复的(参见前两行)。
有没有办法去除这些重复的组?
【问题讨论】:
-
首先,所有事件都选择自己。但是因为
Math.Abs,如果匹配A在匹配B的7s内,匹配A和B都会包含A和B。 -
是的 - 我想省略无关的“A+B”结果(以及更多行的情况下的 A+B+C+...)
-
如果我删除
Math.Abs(并指定在 0 到 7 秒之间),我可以获得 /only/ 具有多个对应附近事件的事件列表,但我也想包括 '查询中的单独事件。
标签: c# sql sql-server linq linq-to-sql