如何使用SQL Orm Lite获得以金字塔方式排序的列表

本文关键字:方式 金字塔 排序 列表 SQL 何使用 Orm Lite | 更新日期: 2023-09-27 17:59:21

我们的一个客户要求我们按照下一个标准显示用户朋友列表中的分数:

如果我的分数是1100,我需要先得到一个朋友列表,按分数最接近我的人排序。如果我的朋友是Gonzalo 1250、Marilda 1100和Marco 950,则列表应按如下顺序排列:

Marilda 1100Gonzalo 1250Marco 950

由于Marilda和我的分数相同,所以分数差为0,所以她离我最近。Gonzalo离我150分,就像Marco一样,但Gonzalo的分数比Marco高,所以他先来,然后Marco。

我们花了一些时间思考如何执行这个查询,但到目前为止还没有任何线索,我们使用的是Service Stack免费版本,它使用SQL Orm Lite进行所有查询。

如何使用SQL Orm Lite获得以金字塔方式排序的列表

这样做的方法可能是的一些变体

select UserName, ABS(Score - @MyScore) as ScoreDelta, Score > @MyScore ? 0 : 1 as HigherOrLower
from ScoreTable
order by ScoreDelta, HigherOrLower

其中UserName和Score是ScoreTable中的列。MyScore是一个标量值。

大多数参赛作品将根据它们与你的分数的差异进行排名。如果打成平局(比如贡萨洛和马可),那么比你得分高的那一个会被排在第一位。

对不起,我认为SQL不完全正确(语法)-我已经有几年没有接触过数据库了。我很确定select语句中的三元条件运算符不是有效的SQL,但您可以理解

或者,如果您有来自数据库的用户/分数对,并希望在应用程序中进行排序,则:

public class UserScore
{
     public string Name { get; private set; }
     public int Score { get; private set; }
     //. . .
}
var sortedScores = from userScore in MyFriendScores
                   orderby Math.Abs(userScore.Score - myScore), userScore.Score > myScore ? -1 : +1
                   select userScore;

var sortedScores = MyFriendScores
                     .OrderBy(o => Math.Abs(o.Score - myScore))
                     .ThenBy(o => o.Score > myScore ? -1 : +1);

这个概念是相同的——首先在ABS上对差异进行排序,然后作为决胜局,对其是否高于或低于你的分数进行排序。