2011-05-20 92 views
2

我有两个IEnumerable集合,我想结合。EF Code First - Linq to Entities Union EqualityComparer

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

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

现在我想结合这两个集合,删除重复项(与主类别相关的新闻文章,也可能被标记为第二类)。

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现在包含两个相同的新闻报道,我不知道为什么作为工会应该使用默认的相等比较?

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

我有圆这个问题的方法是通过传递catNews ID为GetNews功能的列表,并排除他们

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

但我不知道为什么我有这个在我以为工会会删除相同的文章?

回答

2

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