Ø  前言

本示例主要实现 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 使用了过多的派生表,增加了理解的难度性。

转载于:https://www.cnblogs.com/abeam/p/6970722.html

LINQ to SQL 实现 GROUP BY、聚合、ORDER BY相关推荐

  1. LINQ体验(6)——LINQ to SQL语句之Join和Order By

    LINQ体验(6)--LINQ to SQL语句之Join和Order By Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操 ...

  2. [转]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操作符 适用场景:分组数据, ...

  3. linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)

    Group By/Having操作符 适用场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q =from p in ...

  4. SQL语句where,Group By,having order by 的详细使用方法

    为什么80%的码农都做不了架构师?>>>    1. Group By 语句简介: Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Grou ...

  5. C# Linq to SQL — Group by

    需求是需要统计数据库中表某一列的总数量,同时以List的形式返回到UI层. Linq to SQL中的Group by用法如下: IList<Unit.HandleCountClass> ...

  6. SQL中 group by 1, order by 1 语句是什么意思

    https://blog.csdn.net/nxjhi/article/details/51340018 最近学习数据库,在codecademy中, 遇到如下语句 SELECT a.dep_month ...

  7. SQL中group/order by 后面跟数字的理解

    group by,order by 后面跟数字,指的是根据 select 后面查询的列进行分组.排序等,1 代表第一个列,2代表第二个列,依次类推. SELECT id,Name, Price1 FR ...

  8. Oracle子查询中含group by 和order by,排序字段为聚合列的别名+数值函数,外层count统计出错

    该问题猜测是个bug,19c版本执行结果正常,11g版本错误 建议:如果子查询中有group by 和order by,排序字段还需用数值函数处理,避免直接用别名 Oracle版本:11g 原始SQL ...

  9. SQL group by 和 order by 、where、having

    表如下: 基本group by: 排序: order by和group by一起使用: 1 order by 的列,必须是出现在group by 子句里的列 2 order by 要 放在 group ...

最新文章

  1. 《强化学习周刊》第12期:强化学习应用之组合优化
  2. 【Vegas2006】自我介绍for校青春风采大赛
  3. swoole 使用 xdebug 实现调试模式(PHPSTORM)
  4. Struts 2(一):初识Struts
  5. ms project(第一篇笔记)
  6. Android ListView侧滑item,仿QQ删除效果
  7. 如何判断对象是否存活之根搜索算法
  8. Bundle Identifier
  9. 看我如何用Dataphin实现自动化建模
  10. 加州理工学院公开课:机器学习与数据挖掘_过拟化
  11. 安卓玩机之xposed框架安装
  12. PHP货币转中文大写函数
  13. mysql怎么创建blog_「MySQL创建与删除数据库」- 海风纷飞Blog
  14. 07-android-基站定位
  15. (01) Apache Felix 入门 - 01
  16. windows7下系统保护中出现错误“文件名、目录名或卷标语法不正确。(0x8007007B)“ 以及保护设置列表中出现“Windows7_os(c:)(找不到)”选项时的解决方法...
  17. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码
  18. 联想台式机计算机接口,接口篇:四款产品接口配置横向对比_联想ThinkCentre台式电脑_台式电脑评测-中关村在线...
  19. JS实现国家、省、市
  20. linux安装apue库 (UNIX环境高级编程)

热门文章

  1. Mac osx系统中virtual box 中的Ubuntu系统的全屏显示问题解决
  2. PAT_B_1002_Java(20分)
  3. python3基础知识_python3基础知识梳理
  4. 线性代数 矩阵 行列式基本知识(转)
  5. 在Anaconda下安装了TensorFlow库,matplotlib库却调用不了了
  6. 大数据平台蓝图_数据科学面试蓝图
  7. 熊猫分发_实用熊猫指南
  8. 第十三章 时间序列分析和预测
  9. 《城邦暴力团》:一部奇书、反书、隐书
  10. MFC中绘制高亮的图标 VC图标填充半透明色