如何使用 GroupBy 计数-Count()

简介: 十年河东,十年河西,莫欺少年穷。本节探讨的内容很简单,就是如果使用GroupBy计数提供两种方法:第一:把查询的数据,转化为泛型,然后泛型分组计数。                        第二:Linq语句直接分组计数有如下范例:SQL如下:create table S_ca...

十年河东,十年河西,莫欺少年穷。

本节探讨的内容很简单,就是如果使用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 + "");
           }
        }

@陈卧龙的博客

相关文章
|
Kubernetes Cloud Native Java
Seata常见问题之回滚一直在重试如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
|
存储 缓存 关系型数据库
智能辅助驾驶业务遭遇大表瓶颈,小鹏汽车如何破局?
小鹏汽车在智能辅助驾驶业务中遇到数据库性能挑战,如大表查询慢、频繁更新和存储空间快速膨胀。他们原使用的是社区版PostgreSQL,但随着数据量增长,性能瓶颈日益凸显。为了解决这些问题,小鹏汽车采用了阿里云的PolarDB-PG。 PolarDB-PG 的存储具备弹性扩容的能力,最大可支持 100 TB 存储空间。它的大表优化和弹性跨机并行查询(ePQ),成功解决了社区 PostgreSQL 针对大表的查询和并发更新慢的问题。在小鹏汽车的智能辅助驾驶业务上,实现了每日 TB 级大数据表的 7000 万行更新和大数据表秒级分析查询。
80682 2
|
SQL 数据库
SQL-serve数据库不能连接本地服务器的解决方案
SQL-serve数据库不能连接本地服务器的解决方案
965 0
|
SQL 关系型数据库 数据处理
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
详解SQL语句中的GROUP BY和聚合函数COUNT、SUM、AVG、MIN和MAX。
2710 0
|
存储 Kubernetes 数据安全/隐私保护
k8s学习--Secret详细解释与应用
Secret 支持四种类型: - **Opaque Secrets**:存储任意类型机密数据,需自行加密。 - **Service Account Token Secrets**:自动管理 API 访问令牌。 - **Docker Registry Secrets**:存储 Docker 私有仓库认证信息。 - **TLS Secrets**:存储 TLS 证书和私钥,用于加密通信。
1059 0
|
存储 安全 API
使用KMS为Apollo配置中心敏感配置加密的最佳实践
使用KMS为Apollo配置中心敏感配置加密的最佳实践
1984 4
云串流技术多人操作一个3D应用程序的解决方案
云串流技术为每个用户启动独立的3D应用实例,不支持多人同时操作同一程序以避免指令冲突导致崩溃。但在会议或教学场景中,可通过用户逻辑如游客模式、账号密码模式实现轮流操作,点量云串流方案可根据需求定制,适应不同场景。
169 1
|
数据可视化 vr&ar 图形学
技术好文:VTK初识VTK
技术好文:VTK初识VTK
234 0
|
SQL 存储 Oracle
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
快速学习19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍
19 PostgreSQL 锁类型,锁模式,锁冲突,死锁检测的介绍|学习笔记
|
监控 定位技术 Android开发
如何获得你的准确位置及iphon手机应用定位不准确原因分析
如何获得你的准确位置及iphon手机应用定位不准确原因分析
632 0