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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:33:02