LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能

?  前言

本来是想使用 LINQ 实现类似 SQL: ROW_NUMBER() OVER(ORDER BY …) 的功能,但是貌似 LINQ 不支持,反正没找到解决办法,无奈使用了LINQ Select() 方法实现。

1)   需求,需要实现一下 SQL:

SELECT TOP 10 ROW_NUMBER() OVER(ORDER BY T.TotalAmount DESC) AS SN, * FROM

(

SELECT T2.Name, SUM(T2.Amount) AS TotalAmount, SUM(T2.TotalMoney) AS TotalMoney FROM Orders AS T1

LEFT JOIN OrderDetail AS T2 ON(T2.OrderId = T1.Id)

WHERE 1=1

AND T1.SalesUserId = 105

AND T1.PayStatusId = 2

AND (T1.OrderStatusId >=2 AND T1.OrderStatusId <= 8)

GROUP BY T2.Name

) AS T

2)   使用 LINQ Select() 方法

var result = (from t1 in DataContext.Orders

join t2 in DataContext.OrderDetail on t1.Id equals t2.OrderId into temp1

from t12 in temp1.DefaultIfEmpty()

where t1.SalesUserId == salesUserId && t1.PayStatusId == (int)OrderPayStates.Paid

&& (t1.OrderStatusId >= (int)OrderStates.Undelivered

&& t1.OrderStatusId <= (int)OrderStates.ReturnComplete)

group t12 by t12.Name into group1

select new

{

Name = group1.Key,

TotalAmount = group1.Sum(o => o.Amount),

TotalMoney = group1.Sum(o => o.TotalMoney)

}).OrderByDescending(o => o.TotalMoney).Take(10).AsEnumerable()

.Select((obj, index) => new

{

Name = obj.Name,

TotalAmount = obj.TotalMoney,

TotalMoney = obj.TotalMoney,

SN = index + 1

}).ToList();

注意:必须加上 AsEnumerable() 方法

3)   生成SQL:

exec sp_executesql N‘SELECT TOP (10)

[Project1].[C3] AS [C1],

[Project1].[Name] AS [Name],

[Project1].[C1] AS [C2],

[Project1].[C2] AS [C3]

FROM ( SELECT

[GroupBy1].[A1] AS [C1],

[GroupBy1].[A2] AS [C2],

1 AS [C3],

[GroupBy1].[K1] AS [Name]

FROM ( SELECT

[Extent2].[Name] AS [K1],

SUM([Extent2].[Amount]) AS [A1],

SUM([Extent2].[TotalMoney]) AS [A2]

FROM  [dbo].[Orders] AS [Extent1]

LEFT OUTER JOIN [dbo].[OrderDetail] AS [Extent2] ON [Extent1].[Id] = [Extent2].[OrderId]

WHERE ([Extent1].[SalesUserId] = @p__linq__0) AND (2 = [Extent1].[PayStatusId]) AND ([Extent1].[OrderStatusId] >= 2) AND ([Extent1].[OrderStatusId] <= 8)

GROUP BY [Extent2].[Name]

)  AS [GroupBy1]

)  AS [Project1]

ORDER BY [Project1].[C2] DESC‘,N‘@p__linq__0 bigint‘,@p__linq__0=105

4)   最终结果(这是我想要的)

时间: 2024-10-10 02:16:30

LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能的相关文章

LINQ to SQL 实现 GROUP BY、聚合、ORDER BY

?  前言 本示例主要实现 LINQ 查询,先分组,再聚合,最后在排序.示例很简单,但是使用 LINQ 却生成了不同的 SQL 实现. 1)   采用手动编写 SQL 实现 SELECT ROW_NUMBER() OVER(ORDER BY T.RealTotal DESC) AS SN, * FROM ( SELECT (SELECT TradeName FROM UserInfo AS T2 WHERE T2.Id=T1.UserId) AS TradeName, (SELECT UserN

LINQ to SQL语句(5)之Order By

Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序 等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合 排序:延迟,默认是升序,加上descending表示降序,对应的扩展方法是 OrderBy和OrderByDescending 1.简单形式 这个例子使用 orderby 按雇用日期对雇员进行排序: var q = from e in db.Employees orderby e.HireDate select e; 说明:默认为升序 2.带条件形式 注意:W

sql 分页row_number() over(order by key)

? 1 2 3 4 select * from (                 select  row_number() over(order by BD008_001) as row ,* from                                                                             (select * from bd008)t               ) tt where tt.row between 1 and 30

LINQ To SQL 语法及实例大全

LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c

LINQ to SQL语句入门篇 纯属转载

Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c; 再如:筛选1994 年或之后雇用的雇员:

c# LINQ to SQL

list例: List<result_1> list = get_lately_fifty_data(); List<int> number_count = (from c in list orderby c.Number ascending select c.Count).ToList(); datatable例: var q = from p in dt.AsEnumerable() where p.Field<string>("username"

LINQ to SQL语句(1)之Where(抄的好)

Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c; 再如:筛选1994 年或之后雇用的雇员:

LINQ to SQL攻略

LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c; 再如:筛选19

Linq to sql语法

LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c