如何使用 GroupBy 計數-Count()


十年河東,十年河西,莫欺少年窮。

本節探討的內容很簡單,就是如果使用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,'引用橘子')
View Code

想要的結果為:

橘子: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 + "");
           }
        }

@陳卧龍的博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM