You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:21:15