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.pswp.cn/news/252541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252541.shtml
英文地址,請注明出處:http://en.pswp.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…