我在对我的数据库中的球员进行排名时遇到了问题(至少在表现良好的情况下是这样)。
我有一个单独的表,所有的球员都存放在这里。玩家的排名取决于RankingPoints的数量。所以(在最简单的情况下)球员的排名是这个表中由RankingPoints DESC排序的位置。可能有多个玩家具有相同的RankingPoints。因此,我需要一个打破平局的机会,这样得分200.000分的球员的排名就不会改变。
另一方面,根据球员的性别、年龄和国籍,我有一些子级别。
我如何实时阅读排名,例如,我有一个男球员,来自德国的u18,我想知道他的国家排名。
目前,我有这个针对U18CountryRank的子查询
U18CountryRank = Players // the database-table holding all players
.Where(p => p.Gender == MainPlayer.Gender) // male
.Where(p => p.Country == MainPlayer.Country) // Germany
.Where(p => p.Classification == MainPlayer.Classification) // U18
.Where(p => p.RankingPoints >= MainPlayerRankingPoints) // players better or equal than me
.Where(p => SqlFunctions.Difference(p.PlayerId.ToString(), MainPlayer.PlayerId.ToString()) >= 0) // order by PlayerId
.Count(); // take the number这是生成的sql:
SELECT
1 AS [C1],
[Project1].[C1] AS [C2]
FROM ( SELECT
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[Players] AS [Extent2]
WHERE ([Extent2].[RankingPoints] >= [Extent1].[RankingPoints]) AND ([Extent2].[Gender] = [Extent1].[Gender]) AND ([Extent2].[Country] = [Extent1].[Country]) AND ((DIFFERENCE(LOWER( CAST( [Extent2].[PlayerId] AS nvarchar(max))), LOWER( CAST( [Extent1].[PlayerId] AS nvarchar(max))))) >= 0)) AS [C1]
FROM [dbo].[Players] AS [Extent1]
WHERE (cast('b8957470-db27-4b3c-aa5d-3035ca2c86e6' as uniqueidentifier) = [Extent1].[PlayerId])
) AS [Project1]这对单个玩家来说很好。但是当我需要选择某个国家的所有球员时,表现就会像地狱一样。
我已经尝试使用只选择PlayerId和不同等级的View。尽管如此,在较大的设备上性能仍然很差。
另一种方法是在有序子集上使用ROW_NUMBER (但在较大的子集上仍然存在相同的问题)。
针对这类问题的“最佳实践”是什么?
发布于 2018-09-20 04:12:55
下面是我如何在MainPlayer中查找德国male,U18的子排名
var RankOrderedPlayers = Players
.Where(p => p.Gender == MainPlayer.Gender) // male
.Where(p => p.Country == MainPlayer.Country) // Germany
.Where(p => p.Classification == MainPlayer.Classification) // U18
.OrderByDescending(p => p.RankingPoints)
.ThenByDescending(p => p.PlayerId)
.AsEnumerable()
.Select((p, r) => new { Rank = r+1, p });https://stackoverflow.com/questions/52405139
复制相似问题