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

Asp.Net多对多新闻分类表去重问题:Distinct方法无效如何解决?

解决多对多关联表中新闻数据去重的问题

嘿,我明白你的问题了——因为News_To_Category是多对多关联表,每条记录都是「新闻ID+分类ID」的唯一组合,直接对这个表的实体用Distinct()当然没用啦!它只会判断整条关联记录是否完全相同,而不会帮你去重里面的新闻。下面给你几个实用的解决方案:

方法1:提取新闻实体后去重

直接从关联表中筛选出符合状态要求的新闻,再对News实体去重:

ViewBag.News = db.News_To_Category
    .Where(ntc => ntc.News.Status == 1)
    .Select(ntc => ntc.News) // 提取关联的新闻对象
    .Distinct() // 对新闻实体去重
    .ToList();

注:如果EF无法正确判断News实体的相等性(比如没有重写Equals和GetHashCode),这个方法可能还是有问题,那可以试试下面的分组方法。

方法2:按新闻ID分组取唯一新闻

通过GroupBy按新闻ID分组,每组只取第一条新闻,确保无重复:

ViewBag.News = db.News_To_Category
    .Where(ntc => ntc.News.Status == 1)
    .GroupBy(ntc => ntc.NewsId) // 按新闻ID分组
    .Select(g => g.First().News) // 取每组的第一个新闻对象
    .ToList();

方法3:直接从新闻表查询(最推荐)

既然目标是无重复的新闻,不如直接从News表出发,筛选出状态为1且存在分类关联的新闻,效率更高:

ViewBag.News = db.News
    .Where(n => n.Status == 1 && n.News_To_Category.Any()) // 确保新闻有分类关联
    .ToList();

前端代码对应修改

因为现在ViewBag里存的是News实体,不是关联表记录,所以前端循环要调整:

@foreach(News nw in ViewBag.News) {
    <div class="col-md-4 col-sm-4 hidden-sm">
        <div class="blog-home blog-box">
            <div class="blog-top-desc">
                <div class="blog-date">
                    @Convert.ToDateTime(nw.CreateTime).ToString("yyyy-MM-dd")
                </div>
                <!-- 这里继续渲染新闻的标题、内容等其他字段 -->
            </div>
        </div>
    </div>
}

内容的提问来源于stack exchange,提问作者Самир Гасанов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:26