Linq to SQL转换:如何添加第二个COUNT函数?
搞定SQL转LINQ的COUNT问题~
先帮你理清楚原SQL的核心逻辑:
COUNT(*)是统计每个校区(Campus_Name)下的所有实验室总数(不管有没有对应的子网)COUNT(s.Lab_Space_Id)是统计每个校区下有子网关联的实验室数(左连接后,没有子网的记录里s.Lab_Space_Id是NULL,COUNT会自动忽略这些空值)
你现有的LINQ已经用DefaultIfEmpty()实现了左连接,只需要调整分组后的统计逻辑就行。这里给你两种写法,都能完美对应原SQL的效果:
写法一:完全对应SQL的左连接逻辑
这种写法和你原SQL的执行逻辑几乎一致,容易理解:
var query = from l in Vw_Lab_Space // 先把每个实验室对应的子网分组,再用DefaultIfEmpty触发左连接 join s in Vw_Subnet on l.Lab_Space_Id equals s.Lab_Space_Id into subnetGroup from s in subnetGroup.DefaultIfEmpty() // 按校区名称分组 group new { l, s } by l.Campus_Name into campusGroup // 按校区名称排序(对应SQL的ORDER BY 1) orderby campusGroup.Key select new { Campus_Name = campusGroup.Key, // 统计分组内的总记录数,对应COUNT(*) Labs = campusGroup.Count(), // 统计有子网的记录数(s不为空就说明有对应子网),对应COUNT(s.Lab_Space_Id) LabsWithSubnets = campusGroup.Count(item => item.s != null) };
写法二:更高效的分组统计(避免冗余记录)
如果数据量比较大,这种写法会更高效——它不需要展开所有左连接的记录,而是直接判断每个实验室是否有子网,再分组求和:
var query = from l in Vw_Lab_Space // 关联子网并分组,判断当前实验室是否有子网 join s in Vw_Subnet on l.Lab_Space_Id equals s.Lab_Space_Id into subnets let hasSubnet = subnets.Any() ? 1 : 0 // 按校区分组 group hasSubnet by l.Campus_Name into campusGroup orderby campusGroup.Key select new { Campus_Name = campusGroup.Key, // 总实验室数就是分组内的元素个数 Labs = campusGroup.Count(), // 有子网的实验室数是所有hasSubnet的和 LabsWithSubnets = campusGroup.Sum() };
两种写法都能得到和你原SQL完全一样的结果,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Gargoyle
相关产品推荐
相关产品推荐

