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,提问作者Самир Гасанов
相关产品推荐
相关产品推荐

