亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

C#3.0入門系列(九)-之GroupBy操作

系統 2108 0

有朋友反饋說我提供的sample不能編譯。大概是版本的問題,可以到 http://msdn2.microsoft.com/en-us/bb330936.aspx 下載for beta1的版本。本節接著講groupby。
上一節,我們講了如何理解groupby返回的結果。本節會延這個思路闡述下去。先來看下面的例子

GroupBy操作中Select的匿名類
???????????? var ?q? = ? from ?p? in ?db.Products
????????????????????
group ?p? by ?p.CategoryID? into ?g
????????????????????
select ?new?{?CategoryID? = ?g. Key ,?g?};
本例中,select操作中使用了匿名類。本系列中第一次提到匿名類是在 http://www.cnblogs.com/126/archive/2006/12/20/503519.html ?一文中。本文將再一次,闡述匿名類的理解。所謂匿名類,其實質,并不是匿名,而是編譯器幫你去創建了這么一個類,在用戶看來,好像并沒有去創建,此所謂匿名類。也就是說,編譯器在編譯時,還是有這個類的,這個類是編譯器自己創建的,其名稱是編譯器界定的。 在上例的匿名類中,有2個property,一個叫CategoryID, 一個叫g。 大家要注意了,這個匿名類,其實質是對返回結果重新進行了包裝。而那個叫做g的property,就封裝了一個完整的分組。如圖,仔細比較和上篇圖的區別。
C#3.0入門系列(九)-之GroupBy操作
如果,使用下面的語句。
???????????? var ?q? = ? from ?p? in ?db.Products
????????????????????
group ?p? by ?p.CategoryID? into ?g
????????????????????
select ?new?{?CategoryID? = ?g. Key ,GroupSet? = ?g?};
只是把g重新命名為GroupSet.需要用下面的遍歷,獲取每個產品紀錄。
???????????? foreach ?(var?gp? in ?q)
????????????
{
????????????????
if ?(gp.CategoryID? == ? 7 )
????????????????
{???
????????????????????
foreach ?(var?p? in ?gp.GroupSet)
????????????????????
{?
????????????????????
????????????????????}

????????????????}

????????????}
這里groupby的操作相對難理解些,主要原因,它包含了整個分組的具體信息,而不是簡單的求和,取平均值等。如果在最終結果中,也就是在select語句中,不包含g的全部信息,而只是g的聚合函數。又會是怎么樣的一番風景呢?
GroupBy中的Max, Min, Sum, Average,Count
如果,只想取每類產品中,單價為最大,用T-sql該怎么辦呢?是不是要這么來寫
SELECT ? MAX ( [ t0 ] . [ UnitPrice ] )? AS ? [ MaxPrice ] ,? [ t0 ] . [ CategoryID ]
FROM ? [ dbo ] . [ Products ] ? AS ? [ t0 ]
GROUP ? BY ? [ t0 ] . [ CategoryID ]
我們來看看,dlinq如何來做同樣的事情.如下,先按CategoryID歸類,然后,只取CategoryID值和同類產品中單價最大的。
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????MaxPrice?
= ?g. Max (p? => ?p.UnitPrice)
????????};

在這里,Max函數只對每個分組進行操作。我們來看看其結果
C#3.0入門系列(九)-之GroupBy操作
呀,這次,dlinq并沒有把組里所有的紀錄都取出來的嗎。(請參考 http://www.cnblogs.com/126/archive/2006/09/01/486388.html 一文中的方法,配置sample.) dlinq只是簡單做了統計,并返回結果。
每類產品中,單價為最小的,

???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????MinPrice?
= ?g. Min (p? => ?p.UnitPrice)
????????};
每類產品的價格平均值
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????AveragePrice?
= ?g.Average(p? => ?p.UnitPrice)
????????};
每類產品,價格之和
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????TotalPrice?
= ?g. Sum (p? => ?p.UnitPrice)
????????};
各類產品,數量之和
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????NumProducts?
= ?g. Count ()
????????};
如果用OrderDetails表做統計,會更好些,因為,不光可以統計同一種產品,還可以統計同一訂單。
接著統計,同各類產品中,斷貨的產品數量。使用下面的語句。
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
select ?new?{
????????????g.
Key ,
????????????NumProducts?
= ?g. Count (p? => ?p.Discontinued)
????????};
在這里,count函數里,使用了Lambda表達式。在上篇中,我們已經闡述了g是一個組的概念。那在該Lambda表達式中的p,就代表這個組里的一個元素或對象,即某一個產品。還可以使用where條件來限制最終篩選結果
???? var ?q? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?p.CategoryID? into ?g
????????
where ?g. Count ()? >= ? 10
????????
select ?new?{
????????????g.
Key ,
????????????ProductCount?
= ?g. Count ()
????????};
這句在翻譯成sql語句時,欠套了一層,在最外層加了條件。
SELECT ? [ t1 ] . [ CategoryID ] ,? [ t1 ] . [ value2 ] ? AS ? [ ProductCount ]
FROM ?(
????
SELECT ? COUNT ( * )? AS ? [ value ] ,? COUNT ( * )? AS ? [ value2 ] ,? [ t0 ] . [ CategoryID ]
????
FROM ? [ dbo ] . [ Products ] ? AS ? [ t0 ]
????
GROUP ? BY ? [ t0 ] . [ CategoryID ]
????)?
AS ? [ t1 ]
WHERE ? [ t1 ] . [ value ] ? >= ? @p0
-- ?@p0:?Input?Int32?(Size?=?0;?Prec?=?0;?Scale?=?0)?[10]
--
?Context:?SqlProvider(Sql2005)?Model:?AttributedMetaModel?Build:?2.0.20612.0

GroupBy操作中GroupBy的匿名類
第一次談到匿名類 時,我們就提到不光Select操作可以使用匿名類,其他操作符也可以。但是,OrderBy不支持。請參考 C#3.0入門系列(六)-之OrderBy操作

當用戶既想按產品的分類,又想按供應商來做分組,該怎么辦呢。這時,我們就該使用匿名類。

???? var ?categories? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?new?{?p.CategoryID,?p.SupplierID?}? into ?g
????????
select ?new?{g. Key ,?g};

在by后面,new出來一個匿名類。這里,Key其實質是一個類的對象,Key包含兩個Property,一個是CategoryID,再一個是SupplierID ,要想取到具體CategoryID的值,需要g.Key.CategoryID,才能訪問到。我們來看dlinq翻譯的T-sql語句。

SELECT ? [ t0 ] . [ SupplierID ] ,? [ t0 ] . [ CategoryID ]
FROM ? [ dbo ] . [ Products ] ? AS ? [ t0 ]
GROUP ? BY ? [ t0 ] . [ CategoryID ] ,? [ t0 ] . [ SupplierID ]
-- ?Context:?SqlProvider(Sql2005)?Model:?AttributedMetaModel?Build:?2.0.20612.0

先按CategoryID,再按SupplierID ,和匿名類中的循序一樣。
最后一個例子。

???? var ?categories? =
????????
from ?p? in ?db.Products
????????
group ?p? by ?new?{?Criterion? = ?p.UnitPrice? > ? 10 ?}? into ?g
????????
select ?g;

按產品單價是否大于10分類。其結果為兩類,大于的是一類,小于及等于為另一類。好了,剩下的,大家自己多去領會。

?

TrackBack: http://www.cnblogs.com/126/archive/2007/07/10/812621.html

C#3.0入門系列(九)-之GroupBy操作


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品一久久香蕉产线看 | 国产精品成人一区二区 | 99re6这里有精品热视频在线 | 久久99免费 | 国产视频一区二区在线播放 | 国内精品久久久久久 | 美女久草 | 偷偷狠狠的日日2020 | 国产成+人+综合+欧美 亚洲 | 亚洲资源站资源网在线 | 国产日韩在线 | 免费观看国产网址你懂的 | 亚洲精品高清在线 | 久久国产美女免费观看精品 | 国产成人亚综合91精品首页 | 亚洲tv精品一区二区三区 | 国产精品久久久久久久福利院 | 成人午夜啪啪免费网站 | 国产97在线视频观看 | 国产aaa免费视频国产 | 国产亚洲精品久久久久久午夜 | 成人看片黄a毛片 | 亚洲欧美在线中文字幕不卡 | 国产九九在线观看播放 | 超高清欧美videos360 | 老司机成人午夜精品福利视频 | 国产1区2区三区不卡 | 久草热久草视频 | 国产精品美女久久久久网 | 欧美日韩亚洲国产综合 | 男人的天堂免费在线观看 | 欧美韩国日本一区 | 99视频精品国在线视频艾草 | 中文xxx视频 | 日韩经典中文字幕 | 欧美专区在线 | 精品四虎免费观看国产高清午夜 | 91精品国产美女福到在线不卡 | 欧美体内she精视频毛片 | 手机看片福利盒子久久 | 久久久夜色精品国产噜噜 |