十年河東,十年河西,莫欺少年窮。
本節探討的內容很簡單,就是如果使用GroupBy計數
提供兩種方法:第一:把查詢的數據,轉化為泛型,然后泛型分組計數。
第二:Linq語句直接分組計數
有如下范例:
SQL如下:

create table S_cate ( cateId int identity(1,1) primary key, cateName varchar(20), ) create table S_info ( Sid int identity(1,1) primary key, cateId int FOREIGN KEY REFERENCES S_cate(cateId), content varchar(100) ) insert into S_cate values('蘋果') insert into S_cate values('香蕉') insert into S_cate values('橘子') insert into S_cate values('桃子') insert into S_info values(1,'引用蘋果') insert into S_info values(1,'引用蘋果') insert into S_info values(1,'引用蘋果') insert into S_info values(1,'引用蘋果') insert into S_info values(2,'引用香蕉') insert into S_info values(2,'引用香蕉') insert into S_info values(2,'引用香蕉') insert into S_info values(3,'引用橘子') insert into S_info values(3,'引用橘子')
想要的結果為:
橘子:2 蘋果:4 桃子:0 香蕉:3
那么用LINQ該如何實現呢?
首先新建返回的數據類型:
public class MSTS { public int cateId { get; set; } public string cateName { get; set; } public int count { get; set; } }
我們采用cateId 和 cateName 聯合分組:
LINQ如下:
#region 分組測試 /// <summary> ///LINQ分組示例 /// </summary> /// <returns></returns> public List<MSTS> GetCates() { using (AnbSosCustomerEntities context = new AnbSosCustomerEntities()) { List<MSTS> Mlist = new List<MSTS>(); var S_cate = context.S_cate; var S_info = context.S_info; // var Query = from Cate in S_cate join Info in S_info on Cate.cateId equals Info.cateId into temp from tt in temp.DefaultIfEmpty() select new { cateId=Cate.cateId, cateName = Cate.cateName, content=tt.content }; var data = Query.GroupBy(a => new { a.cateId, a.cateName }).Select(a => new MSTS { cateName = a.Key.cateName, cateId = a.Key.cateId, count = a.Count(C => C.content != null) }); Mlist = data.ToList(); return Mlist; } } #endregion
其實上述的LINQ相信大家都能很快寫出來,但是我要強調的是Count('里面的參數')
也就是這一句:
加上這句篩選,就是為了防止將桃子統計為 1
這樣調試的結果為:
以上便是第一種方法!
那么第二種方法也很簡單,思路是:左連接查詢數據,然后把查詢的結果轉化為泛型,最后利用泛型分組:
在此直接上代碼了:
MSTS類變更如下:
public class MSTS { public int cateId { get; set; } public string cateName { get; set; } public string content { get; set; } }
LINQ查詢變更如下:
#region 分組測試 /// <summary> ///LINQ分組示例 /// </summary> /// <returns></returns> public List<MSTS> GetCates() { using (AnbSosCustomerEntities context = new AnbSosCustomerEntities()) { List<MSTS> Mlist = new List<MSTS>(); var S_cate = context.S_cate; var S_info = context.S_info; // var Query = from Cate in S_cate join Info in S_info on Cate.cateId equals Info.cateId into temp from tt in temp.DefaultIfEmpty() select new MSTS { cateId = Cate.cateId, cateName = Cate.cateName, content = tt.content }; Mlist = Query.ToList(); return Mlist; } } #endregion
調試實時信息如下:
從調試信息可以看出:因為桃子沒被引用過,所以桃子對應的content為null
那么泛型的分組也和linq一樣,都是要篩選這個字段的值
泛型分組如下:
IBase Implement = new BaseImplement(); protected void Page_Load(object sender, EventArgs e) { List<MSTS> ls = new List<MSTS>(); ls = Implement.GetCates(); var Gls = ls.GroupBy(a => new { a.cateId,a.cateName}).Select(g => (new { cateName = g.Key.cateName,cateId=g.Key.cateId, count = g.Count(A=>A.content!=null) })); foreach (var item in Gls) { Response.Write(item.cateName + "的數量為:" + item.count + "!"); } }
@陳卧龍的博客