EF Code First - Linq to Entities Union EqualityComparer

本文关键字:Entities Union EqualityComparer to Linq Code First EF | 更新日期: 2023-09-27 17:57:24

我有两个 IEnumerable 集合,我想联合起来。

选择与特定类别关联的新闻对象。当用户按类别过滤时,我还希望显示已标记为另一个类别的新闻文章。

所以我有另一个查询,它返回用特定子类别标记的新闻对象。

现在我想将两个集合合并,删除重复项(作为与主要类别相关的新闻文章,也可以标记为第二类)。

 var catNews = model.Category.News.SelectMany(n => n.News); //get news article associated to the category
 var tagNews = _nr.GetNews(model.Category.relatedCategoryName); //this selects news by tags - which I want as the related category name
 model.News = catNews.Union(tagNews).OrderByDescending(p => p.Date); //union the two collections

但是,模型。新闻现在包含两篇相同的新闻文章,我不确定为什么工会应该使用默认的平等比较器?

我在这里做错了什么吗?我使用的是 EF 代码优先,我的主键是新闻 ID。

我解决这个问题的方法是将catNews ID列表传递给GetNews函数并排除它们

if (excludeIds != null)
    q = q.Where(n => !excludeIds.Contains(n.ID));

但是我不确定为什么当我认为工会会删除相同的文章时,我必须这样做?

EF Code First - Linq to Entities Union EqualityComparer

我猜您没有从实体框架上下文的同一实例加载这两个集合。默认相等比较器将比较引用,如果您使用相同的上下文,当Id匹配时,它确实会在两个集合中返回相同的News实例,但如果您使用不同的上下文,则每个集合将包含其自己的News实例,Union将执行与Concat相同的操作。在这种情况下,您必须覆盖News实体中的Equals(和GetHaschCode)以比较Id或使用自定义比较器。