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)   结果集(两种实现方式相同)

clip_image001[6]

 

Ø  总结:可以看出 LINQ 生成的查询语句中,在子查询中使用 WHERE + DICTINCT 实现,并没有GROUP BY。两者执行耗时也没有什么区别,只是 LINQ 使用了过多的派生表,增加了理解的难度性。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql之事务

什么是事务 假如你下了一笔订单&#xff0c;会有以下数据库操作&#xff1a; 1. 生成一笔订单记录 2. 减少库存 3. 从你的账户中减少金额 4. 生成支付记录 这边的四个操作缺一不可&#xff0c;一旦某一个操作出现异常&#xff0c;则全部操作都需要全部回滚。而事务的作…

JVM垃圾回收机制总结

对于垃圾回收机制我先抛出三个问题&#xff1a; ①哪些内存需要回收&#xff1f; ②什么时候回收&#xff1f; ③如何回收&#xff1f; 下面我们主要针对这三个问题来研究JVM GC 一、哪些内存需要回收&#xff1f; 1.JAVA使用可达性分析法来判断对象是否需要回收。 这个算法的基…

虚拟机增加内存方法

楼主由于要在虚拟机里面装一个oracle&#xff0c;在安装过程中&#xff0c;提示物理内存不符合最低标准&#xff0c;如图1. 图1 因为懒得新建一个虚拟机了&#xff0c;所以考虑给虚拟机新增磁盘空间。 首先说明&#xff0c;新增磁盘空间&#xff0c;必须保证当前虚拟机里每个新…

myBatis xml if、where、if-else?、foreach 心得

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这…

bzoj千题计划213:bzoj2660: [Beijing wc2012]最多的方案

http://www.lydsy.com/JudgeOnline/problem.php?id2660 很容易想到是先把n表示成最大的两个斐波那契数相加&#xff0c;然后再拆分这两个斐波那契数 把数表示成斐波那契进制的形式&#xff0c;第i位表示有没有第i个斐波那契数 比如16133 001001 那么拆分一个数就是把一个1…

面对对象-封装

private 私有的 package/friendly/default 不写 protected 受保护的 public 公共的 那么什么情况该用什么修饰符呢&#xff1f;从作用域来看&#xff0c;public能够适用所有的情况。 但是大家在工作的时候&#xff0c;又不会真正全部都适用public,那么到底什么情况改用什么修饰…

本文详解5G是个什么鬼,程序员都准备好了吗?

无线移动通讯发展历史 最近5G的概念炒的如火如荼&#xff0c;为此&#xff0c;华为和高通还干了一仗。这篇文章从技术层面给大家分析&#xff0c;什么是5G&#xff0c;它和4G比&#xff0c;高级在哪里&#xff1f; 我们来看看移动互联网的技术发展&#xff1a; 然后我们在来看看…

安装kerberos报错 error: command 'gcc' failed with exit status 1

pip install kerberos 报错&#xff1a;error: command gcc failed with exit status 1 安装环境工具 yum install gcc libffi-devel python-devel openssl-devel 再次安装kerberos安装成功 转载于:https://www.cnblogs.com/panbc/p/8268574.html

jquery正则表达式验证:验证全是数字

需求说明&#xff1a; 前端页面使用正则表达式验证输入框中输入的内容全是数字。 代码说明&#xff1a; 这里只介绍正则表达式&#xff0c;其他部分的代码不做介绍。如果有其他需要自行修改即可。 步骤一&#xff1a;建立一个页面可以是html、jsp等&#xff0c;引入jquery-3.2.…

0613课堂汇总

一&#xff1a; 数据类型&#xff1a; 基本数据类型{byte(8)/short(16)/char(16)/int(32)/float(32)/long(64)/double(64)/boolean(1)}引用数据类型{*除了基本数据类型都是引用数据类型 *包括API中的类&#xff08;String,File&#xff09;*自定义的类&#xff08;Personal A…

Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...

Istio Gateway提供多个自定义入口网关的支持能力&#xff0c;通过开放一系列端口用于承载网格边缘的进入连接&#xff0c;同时可以使用不同loadbalancer来隔离不同的入口流量。cert-manager可用于使用存储在Kubernetes Secret资源中的任意签名密钥对来获取证书。本文提供了手动…

log4配置

log4j 和 log4j2 方式一&#xff1a;log4j2.xml 添加 jar 包 1 <!-- log4j-core --> 2 <!-- 3 <dependency> 4 <groupId>org.apache.logging.log4j</groupId> 5 <artifactId>log4j-core</artifactId> 6 …

[bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 650 Solved: 283[Submit][Status][Discuss]Description 我们的小朋友很喜欢计算机科学&#xff0c;而且尤其喜欢二叉树。考虑一个含有n个互异正整数的序列c[1],c[2],...,c[n]。…

常用内建模块

一.datetime 1.模块导入: from datetime import datetime 2.获取当前日期和时间: >>> now datetime.now() >>> print(now) 2019-01-13 14:19:38.1810003.获取指定日期和时间: >>> dt datetime(2019,1,10,15,0) >>> print(dt) 2019-01-10…

子序列进阶问题

题目&#xff1a; 有一个数组&#xff0c;让找到两个不重复的连续子序列A,B &#xff0c;求Max(Sum(A)-Sum(B) 分析&#xff1a; AB必定连续&#xff0c;设两端连接处index为{X&#xff0c;x1}&#xff0c;X可取0~n-1 设F(x)为连接处index为{X&#xff0c;x1}时 Max(Sum(A)…

day5-shelve模块

一、概述前面章节我们讲述了json和pickle模块的序列化和反序列化处理&#xff0c;他们有一个不足是在python 3中不能多次dump和load&#xff0c;shelve模块则可以规避这个问题。shelve模块是一个简单的k,v将内存数据通过文件持久化的模块&#xff0c;可以持久化任何pickle可支持…

程序员:请你不要对业务「置之不理」

成长是条孤独的路&#xff0c;一个人会走得更快&#xff1b;有志同道合者同行&#xff0c;会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动&#xff0c;希望能帮助更多同学一起学习、成长。12 月 28 日&#xf…

在Ubuntu系统下如何将chrome浏览器的bookmarks导出到本地

1. 打开chrome浏览器在页面的右上角点击那个三个小点的位置&#xff0c;找到bookmarks&#xff0c;然后点击bookmarks manager,然后在organize右侧大倒三角下选择&#xff0c;export bookmarks to HTML&#xff0c;选择要保存的位置&#xff0c;利用同样的方法下次就可以直接导…

php基于数组的分页实现

关于数组的分页函数,用数组进行分页的好处是可以方便的进行联合多表查询,只需要将查询的结果放在数组中就可以了以下是数组分页的函数,函数page_array用于数组的分页&#xff0c;函数show_array用于分页函数的操作及显示&#xff0c;需要配合使用.两个函数通过全局变量$countpa…

028 -bash-4.1$ 出现故障的原理及解决办法?

最近在搭建分布式的时候&#xff0c;出现了这个问题&#xff0c;很不爽。下面是我的解决方式。 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* /home/beifeng 3.退出&#xff0c;再进入用户 4.解释 set |grep -i ps1 转载于:https://www.cnblogs…