如何在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 表达式中使用 SQL 的 GETDATE() 和 DATEADD()?