ASP.NET中如何统计新闻实体各分类的关联使用次数
解决方案
问题原因
Include是EF Core用于预加载关联实体的API,仅用来指定需要加载的导航属性,不支持在内部写筛选逻辑做统计,你原来的用法不符合API设计初衷,自然得不到正确结果。- 原有循环查询的写法会产生N+1数据库查询问题,分类数量较多时会严重拖慢接口性能。
最优实现方案(单SQL查询,无N+1问题)
直接通过EF Core投影查询,一次性返回所有结果,性能最优,不需要额外循环查库:
public async Task<List<SubCategoryWithCountDTO>> SubCategoryWithCount(int skip, int take) { return await _context.Categories .Where(x => x.ParentId != null) .OrderBy(x => x.CategoryId) .Skip(skip) .Take(take) .Select(c => new SubCategoryWithCountDTO { CategoryId = c.CategoryId, CateGoryName = c.CateGoryName, // 直接统计关联了当前分类的新闻总数 UseCount = _context.News.Count(n => n.Category.Any(cat => cat.CategoryId == c.CategoryId)) }) .ToListAsync(); }
原有循环写法的修正(不推荐)
如果你要保留原有循环逻辑,只需要去掉错误的Include用法即可,但该写法仍存在N+1性能问题,仅适合分类数量极少的场景:
// 替换你原有循环内的统计代码即可 var categoryUse = _context.News.Count(n => n.Category.Any(cat => cat.CategoryId == item.CategoryId));
内容的提问来源于stack exchange,提问作者DeV1
相关产品推荐
相关产品推荐

