LINQ左连接中Count函数工作原理及sp集合结构解析
LINQ分组查询疑问解答
首先贴出查询代码:
var productsPerSupplier = from s in suppliers join p in products on s.Id equals p.SupplierId into sp select new { SupplierId = s.Id, SupplierName = s.Name, ProductCount = sp.Count() };
1. Count函数如何统计每个供应商的产品数量?
这段用的是LINQ的分组连接(Group Join),逻辑是逐个遍历suppliers里的每个供应商s。join...into sp会把所有和当前供应商s匹配(p.SupplierId == s.Id)的产品,打包成专属集合sp。所以sp.Count()就是统计当前供应商对应产品集合的元素数,自然能得到每个供应商的产品数量。
2. 临时集合sp的结构是什么?
sp是IEnumerable<Product>类型的集合(假设products集合存的是Product对象),它只包含当前遍历到的供应商s对应的所有产品——也就是所有SupplierId等于s.Id的产品实例。每个供应商都会对应一个独立的sp集合,彼此没有交集。
3. 为什么不会统计全表所有行数?
因为这里的Count()是调用在单个供应商对应的分组集合sp上,而非整个products表。如果直接写products.Count()才会统计全表行数,但join...into已经把产品按供应商分好组,每个sp都是单个供应商的专属产品子集,所以统计的是子集的元素数,不是全表总数。
查询结果描述
查询返回的是匿名类型集合,每一项包含三个属性:
- SupplierId:供应商ID
- SupplierName:供应商名称
- ProductCount:该供应商的产品数量
最终呈现的是每个供应商及其对应产品数量的列表,比如部分行可能是:供应商ID为1,名称为"Exotic Liquid",产品数量3;供应商ID为2,名称为"New Orleans Cajun Delights",产品数量5等。
内容的提问来源于stack exchange,提问作者Foreastbtch
相关产品推荐
相关产品推荐

