EF Code First - Linq to Entity Union EqualityComparer - PullRequest
3 голосов
/ 20 мая 2011

У меня есть две коллекции 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, и мой первичный ключ - идентификатор новостей.

Я обошёл эту проблему, передав список идентификаторов catNews функции GetNews и исключив их

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

Но я не уверен, зачем мне это, когда я думал, что union удалит идентичные статьи?

1 Ответ

3 голосов
/ 20 мая 2011

Полагаю, вы не загружаете эти две коллекции из одного и того же экземпляра контекста структуры сущностей. Компаратор сравнения по умолчанию будет сравнивать ссылки и, если вы используете один и тот же контекст, он действительно вернет один и тот же экземпляр News в обеих коллекциях, когда Id соответствует, но если вы используете разные контексты, каждая коллекция будет содержать свои собственные News экземпляры и * 1004. * сделает то же самое, что и Concat. В этом случае вы должны переопределить EqualsGetHaschCode) в вашей сущности News для сравнения Id или использовать пользовательский компаратор.

...