.Net MVC Linq查询:统计含棉质衣物的去重人数
解决含棉质衣物的Person统计问题
嘿,我来帮你搞定这个Linq统计的问题!你的原代码存在两个核心问题:一是会重复计数同一个Person下的多条符合条件的织物/衣物,二是语法本身有错误(比如if语句的写法、括号不匹配)。下面给你几种正确的实现方式:
推荐写法:用Any做存在性检查(高效)
这种方式是最推荐的,因为Any会在数据库层面做存在性判断,一旦找到该Person下有符合条件的衣物/织物,就停止检查该用户的其他数据,性能更优:
// 方法语法 int cottonOwnerCount = context.Persons .Where(p => p.Clothes.Any(c => c.Fabrics.Any(f => f.Name == "Cotton"))) .Count();
如果习惯用查询表达式,也可以写成:
// 查询表达式语法 int cottonOwnerCount = (from p in context.Persons where p.Clothes.Any(c => c.Fabrics.Any(f => f.Name == "Cotton")) select p).Count();
备选写法:展开层级后去重计数
如果你想通过展开所有关联层级的方式实现,需要先筛选出所有含棉质织物的Person,再用Distinct()去重,最后统计数量:
int cottonOwnerCount = (from p in context.Persons from c in p.Clothes from f in c.Fabrics where f.Name == "Cotton" select p) .Distinct() .Count();
为什么你的原代码不行?
你的原语句from p in context.Persons from c in p.Clothes from f in c.Fabrics select f.Name == "Cotton"会生成一个包含布尔值的集合(每个符合条件的织物对应一个true),然后Count()会统计所有true的数量,这就会把同一个Person下的多条棉质织物重复计数,完全不符合“同一Person仅计数一次”的需求。
内容的提问来源于stack exchange,提问作者CodeProg
相关产品推荐
相关产品推荐

