如何在linq to sql中使用orderby和partition by获取第一行

Posted

技术标签:

【中文标题】如何在linq to sql中使用orderby和partition by获取第一行【英文标题】:How to get top row using orderby and partition by in linq to sql 【发布时间】:2020-04-20 06:32:08 【问题描述】:
Table
id | name | score
-----------------
3  | jim  | 2
4  | jim  | 1
5  | jim  | 3
6  | Ace  | 2
7  | Ace  | 1

我想返回 2 条得分最高的记录。王牌 2 和吉姆 3。 我在 sql 中做到了这一点,但我似乎无法在 linq 中正确转换它。 SQL查询:

SELECT *
      FROM   (SELECT Row_number() 
                       OVER( 
                         partition BY name
                         ORDER BY score DESC) AS rn, 
                     score, 
                     id, 
                     name, 
              FROM  table ) AS a 
      WHERE  rn = 1 

这是我在 linq 中开始的:

ctx.records.GroupBy(r => r.name).Select(g => g.OrderByDescending(i => i.score)).ToList();

感谢您的帮助。

【问题讨论】:

ctx.records.OrderByDescending(r => r.score).GroupBy(r => r.name).Select(g => g.FirstOrDefault()).ToList();跨度> @jdweng 做到了。谢谢! 【参考方案1】:

你可以试试这种方式,现场演示here

using System;
using System.Linq;

public class Program

    public static void Main()
    
        var records = new []
        
            new Record  id = 3, name = "jim", score = 2 ,
            new Record  id = 4, name = "jim", score = 1 ,
            new Record  id = 5, name = "jim", score = 3 ,
            new Record  id = 6, name = "Ace", score = 2 ,
            new Record  id = 7, name = "jim", score = 1 
        ;

        var result = records.GroupBy(p => p.name)
                            .Select(g => new  Name = g.Key, Score = g.Max(p => p.score) )
                            .ToList();
        foreach(var item in result)
            Console.WriteLine("Name: " + item.Name + " Score: " + item.Score);
    

    public class Record
    
        public int id get; set;
        public string name  get; set;
        public int score get; set;

    

【讨论】:

以上是关于如何在linq to sql中使用orderby和partition by获取第一行的主要内容,如果未能解决你的问题,请参考以下文章

使用DISTINCT时,LINQ to SQL不生成ORDER BY?

linq to sql 怎么查前5条记录

关于Linq to Sql的分页

如何在 Linq to SQL 表达式中使用 SQL 的 GETDATE() 和 DATEADD()?

EF Core Linq-to-Sql GroupBy SelectMany 不适用于 SQL Server

如何使用存储过程在 LINQ to SQL 中使用事务?