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 UserName FROM UserInfo AS T2 WHERE T2.Id=T1.UserId) AS UserName, SUM(T1.RealTotal) AS RealTotal FROM Orders AS T1
WHERE 1=1 AND T1.SalesUserId=131 AND T1.PayStatusId=2
AND (T1.PayTime>='2017-05-01 00:00:00' AND T1.PayTime<='2017-05-31 23:59:59')
GROUP BY T1.UserId
) AS T
2) LINQ 实现
var query = (from t1 in DataContext.Orders
where t1.SalesUserId == salesUserId && (t1.PayTime >= mbdt && t1.PayTime <= medt)
group t1 by t1.UserId into g1
select new
{
TradeName = (from t2 in DataContext.UserInfo
where t2.id == g1.Key
select t2.TradeName).FirstOrDefault(),
UserName = (from t2 in DataContext.UserInfo
where t2.id == g1.Key
select t2.userName).FirstOrDefault(),
RealTotal = g1.Sum(o => o.RealTotal)
}
into v1
orderby v1.RealTotal descending
select v1).AsEnumerable().Select((o, i) =>
new CustomOrderAmountRankingModel
{
Sn = i + 1,
CustomerShopName = o.TradeName,
RegisterUserName = o.UserName,
OrderAmount = o.RealTotal
});
3) 生成SQL
exec sp_executesql N'SELECT
[Project10].[C1] AS [C1],
[Project10].[C2] AS [C2],
[Project10].[C3] AS [C3],
[Project10].[C4] AS [C4]
FROM ( SELECT
1 AS [C1],
[Project9].[C1] AS [C2],
[Project9].[C2] AS [C3],
[Project9].[C3] AS [C4]
FROM ( SELECT
[Project8].[C1] AS [C1],
[Project8].[C2] AS [C2],
(SELECT
SUM([Extent4].[RealTotal]) AS [A1]
FROM [dbo].[Orders] AS [Extent4]
WHERE ([Extent4].[SalesUserId] = @p__linq__0) AND ([Extent4].[PayTime] >= @p__linq__1) AND ([Extent4].[PayTime] <= @p__linq__2) AND ([Project8].[UserId] = [Extent4].[UserId])) AS [C3]
FROM ( SELECT
[Project7].[UserId] AS [UserId],
[Project7].[C1] AS [C1],
[Project7].[C2] AS [C2]
FROM ( SELECT
[Project5].[UserId] AS [UserId],
[Project5].[C1] AS [C1],
(SELECT TOP (1)
[Extent3].[userName] AS [userName]
FROM [dbo].[UserInfo] AS [Extent3]
WHERE [Extent3].[id] = [Project5].[UserId]) AS [C2]
FROM ( SELECT
[Project4].[UserId] AS [UserId],
[Project4].[C1] AS [C1]
FROM ( SELECT
[Project2].[UserId] AS [UserId],
(SELECT TOP (1)
[Extent2].[TradeName] AS [TradeName]
FROM [dbo].[UserInfo] AS [Extent2]
WHERE [Extent2].[id] = [Project2].[UserId]) AS [C1]
FROM ( SELECT
[Distinct1].[UserId] AS [UserId]
FROM ( SELECT DISTINCT
[Extent1].[UserId] AS [UserId]
FROM [dbo].[Orders] AS [Extent1]
WHERE ([Extent1].[SalesUserId] = @p__linq__0) AND ([Extent1].[PayTime] >= @p__linq__1) AND ([Extent1].[PayTime] <= @p__linq__2)
) AS [Distinct1]
) AS [Project2]
) AS [Project4]
) AS [Project5]
) AS [Project7]
) AS [Project8]
) AS [Project9]
) AS [Project10]
ORDER BY [Project10].[C4] DESC',N'@p__linq__0 bigint,@p__linq__1 datetime2(7),@p__linq__2 datetime2(7)',@p__linq__0=131,@p__linq__1='2017-05-01 00:00:00',@p__linq__2='2017-05-31 23:59:59'
4) 结果集(两种实现方式相同)

Ø 总结:可以看出 LINQ 生成的查询语句中,在子查询中使用 WHERE + DICTINCT 实现,并没有GROUP BY。两者执行耗时也没有什么区别,只是 LINQ 使用了过多的派生表,增加了理解的难度性。
LINQ to SQL 实现 GROUP BY、聚合、ORDER BY的更多相关文章
- C# Linq to sql 实现 group by 统计多字段 返回多字段
Linq to sql 使用group by 统计多个字段,然后返回多个字段的值,话不多说,直接上例子: where u.fy_no == fy_no orderby u.we_no group u ...
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in ...
- linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符) (转帖)
http://wenku.baidu.com/link?url=2RsCun4Mum1SLbh-LHYZpTmGFMiEukrWAoJGKGpkiHKHeafJcx2y-HVttNMb1BqJpNdw ...
- [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
本文转自:http://www.cnblogs.com/jack-liang/archive/2011/03/22/1991554.html Group By/Having操作符 适用场景:分组数据, ...
- SQL的GROUP BY 与 Order By
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- SQL语句group by 与order by 执行顺序引发的一场“内斗”
直入主题!看看下面这SQL会不会报错?如果报错应该是什么错误! --说明:黑色字体都是列SELECT application_id, index_num, num, amount FROM `cred ...
- LINQ to SQL语句之Join和Order By
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...
- LINQ体验(6)——LINQ to SQL语句之Join和Order By
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系.多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中.分别为Join(Join查询), SelectM ...
- LINQ to SQL 模拟实现 ROW_NUMBER() OVER(ORDER BY ...) 的功能
Ø 前言 本来是想使用 LINQ 实现类似 SQL: ROW_NUMBER() OVER(ORDER BY -) 的功能,但是貌似 LINQ 不支持,反正没找到解决办法,无奈使用了LINQ Sele ...
随机推荐
- MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇
1)对于MyISAM表,如果用UPDATE更新自增列,如果列值与已有的值重复,则会出错:如果大于已有的最大值,则会自动更新表的AUTO_INCREMENT,操作是安全的. (2)对于innodb表,u ...
- os模块+sys模块+random模块+shutil模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cdos.curdir ...
- mysql登录密码相关
设置root登录密码 方法一:用root 进入mysql后 mysql>set password =password('你的密码'); mysql>flush privileges; 方法 ...
- 【Mysql】—— MySQL存储引擎中的MyISAM和InnoDB区别详解
在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...
- html5 画布和SVG的差别
canvas和SVG可以在浏览器绘制图形,但是本质上是不同的.canves是绘制2d图象,SVG也是绘制2d图象. Canvas是Javascript进行绘图的,是逐像素绘图.Canvas一旦图象绘制 ...
- 学习笔记之csrf
CBV 添加 csrf 第一种: 指定方法方面添加 装饰器 @memethod_decorator(xxx) 第二种 全部添加: 注意 在类名前: @method_decorator(xxx,name ...
- ZJOI2019 Day1游记
退役吧垃圾 考的再烂还是要把自己捡起来 如果不想让自己的OI生涯就到这里止步的话 就给我滚去拿剩下的300分吧 浙江省前十六,学校前五,day1比别人差一百多分.如果这样还能进省队的话,我就成为传说了 ...
- 荣耀实锤Magic2或将助力AI,再次带动成长?
临近年底,热闹了一年的手机圈纷纷偃旗息鼓,准备为明年3月的新品发力.然而今天(12月7日),恰逢节气大雪,@荣耀手机 在微博发布了一张预热海报,随后荣耀总裁赵明转发这条微博表示「关于技术,真的有很多话 ...
- Saddle Point ZOJ - 3955(求每个值得贡献)
题意: 给出一个矩阵,删掉一些行和列之后 求剩下矩阵的鞍点的总个数 解析: 对于每个点 我们可以求出来 它所在的行和列 有多少比它大的 设为a 有多少比它小的 设为b 然后对于那些行和列 都有两种操 ...
- POJ1177(扫描线求周长并)
题意:..求周长并... 解析:参考求面积并 图借鉴自:https://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464876.html 自下而上扫描 ...