c# - Linq for rank() 在 SQL Server 中等效 -

标签 c# .net linq list

如何在 SQL 中使用 Linq 等于 rank() 对我的列表进行排序?

例如排名是我的List<Player>

class Player
{
    public int Id;
    public int RankNumber;
    public int Points;
    public int Name;

}

原榜单:

RankNumber   Points  Name    Id
    1          100    James   01
    2          80     Mike    50
    3          80     Jess    22
    4          50     Jack    11
    5          50     Paul    03  
    6          10     Monik   13

我需要这个等级:

RankNumber   Points  Name    Id
    1          100    James   01
    2          80     Mike    50
    2          80     Jess    22
    4          50     Jack    11
    4          50     Paul    03  
    6          10     Monik   13

最佳答案

我认为没有将其直接转换为 Linq to SQL 的好方法,但您可以这样做:

var rankedPlayers = players
    .OrderByDescending(p => p.Points)
    .Select((p, r) => new Player
    {
        Id = p.Id,
        RankNumber = players.Where(pl => pl.Points > p.Points).Count() + 1,
        Points = p.Points,
        Name = p.Name
    });

它会为您提供正确的输出,但会可怕且低效地转换为 SQL。所以我建议在创建排名之前将数据具体化到列表中的这种修改:

var rankedPlayers = players
    .OrderByDescending(p => p.Points)
    .ToList() //<--- Add this
    .Select((p, r) => new Player
    {
        Id = p.Id,
        RankNumber = players.Where(pl => pl.Points > p.Points).Count() + 1,
        Points = p.Points,
        Name = p.Name
    });

关于c# - Linq for rank() 在 SQL Server 中等效 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33488110/

相关文章:

c# - 启动后立即执行计时器?

c# - 打包 .NET 应用程序以便它可以在没有 .NET 的计算机上运行

c# - 表示分层数据.net winforms

c# - 是否可以在 LINQPad 中使用 LINQ 调用存储过程?

c# - System.Linq.Dynamic 错误 类型 'StringComparison' 中不存在属性或字段 'Person'

c# - 套接字异步事件参数? - 简单的例子

c# - 从包含树状数据的 DataTable 或 List 填充 TreeView

c# - 通过单个套接字多次发送数据

c# - SQLite .Net 性能

.net - 使用 LumenWorks 中的 CsvReader 和 ";"分隔符