EF Code First – Linq to Entities Union 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));
但是,当我认为工会将删除相同的文章时,我不确定为什么我必须这样做?
我猜你没有从entity framework上下文的同一个实例加载这两个集合。 默认的相等比较器将比较引用,如果使用相同的上下文,当Id
匹配时,它确实会在两个集合中返回相同的News
实例,但如果使用不同的上下文,则每个集合将包含其自己的News
实例, Union
将与Concat
相同。 在这种情况下,您必须在News
实体中覆盖Equals
(和GetHaschCode
)以比较Id
或使用自定义比较器。
上述就是C#学习教程:EF Code First – Linq to Entities Union EqualityComparer分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949927.html