c# - EF Code First - Linq to Entities Union EqualityComparer

标签 c# linq linq-to-entities union ef-code-first

我有两个 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

但是,model.News 现在包含两篇相同的新闻文章,我不确定为什么 union 应该使用默认的相等比较器?

我是不是做错了什么?我正在使用 EF Code First,我的主键是新闻 ID。

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

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

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

最佳答案

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

关于c# - EF Code First - Linq to Entities Union EqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068575/

相关文章:

LINQ 抛出查询嵌套太深异常

c# - 如何将 LINQ 结果匿名类型传递给另一个方法?

c# - 为什么此 Entity Framework LINQ 查询不会产生 SELECT DISTINCT?

entity-framework - 您可以选择实体集合的所有子集合作为单个集合吗?

c# - 删除对象及其相关实体

c# - 在if语句中将整数变量与整数列表进行比较的任何方法

c# - 如何: Create a Key In the Registry (Visual C#)?

sql - LINQ to SQL 错误 : specified cast is not valid

运行控制台命令的 C# 问题

c# - StreamWriter 创建目录而不是文件