编程语言
首页 > 编程语言> > C#-EF代码优先-实体联合的Linq EqualityComparer

C#-EF代码优先-实体联合的Linq EqualityComparer

作者:互联网

我有两个要合并的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现在包含两个相同的新闻文章,并且我不确定为什么工会应该使用默认的相等比较器?

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

解决这个问题的方法是将catNews id的列表传递给GetNews函数,并将其排除在外

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

但是我不确定为什么我以为工会会删除相同的条款时为什么要这样做?

解决方法:

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

标签:ef-code-first,linq-to-entities,union,linq,c
来源: https://codeday.me/bug/20191208/2091103.html