【问题标题】:Linq for rank() equivalent in SQL Server -SQL Server 中等价于 rank() 的 Linq -
【发布时间】:2015-11-02 22:21:53
【问题描述】:

如何在 SQL 中使用 Linq equals 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

【问题讨论】:

  • 好像是几个不同的解决方案here.
  • 你可以试试这个answer1或者这个answer2

标签: c# .net linq list


【解决方案1】:

我认为没有直接将其转换为 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
    });

【讨论】:

    【解决方案2】:

    你可以试试下面的表达式:

    var newData = players
                 .OrderByDescending(x => x.Points)
                 .GroupBy(x => x.Points)                 
                 .SelectMany((x, index) => x.Select(y => new Player
                {
                    Name = y.Name,
                    Points = y.Points,
                    RankNumber = index + 1,
                    Id = y.Id
                }));
    

    players 包含 IEnumerable 类型的 Player 对象,newData 包含具有排名的有序数据。

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2012-08-16
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多