Linq to Entities — получить список всех уникальных связанных сущностей

asp.net mvc 4, Entity Framework 5, SQL Server 2012 Express, Code First

У меня есть модель Place:

public virtual int PlaceID { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public virtual string Name { get; set; }

и связанная модель тега:

public virtual int TagID { get; set; }
public virtual string Name { get; set; }
public virtual string NamePlural { get; set; }
public virtual ICollection<Place> Places { get; set; }

они имеют отношение многие ко многим.

У меня есть список мест, и я хотел бы создать список тегов, заполненный каждым (уникальным) тегом, связанным с каждым местом в «местах».

Например, у одного места могут быть теги «ресторан» и «паб», у другого — «паб» и «бар», у третьего — «магазин» и «кафе».

Я хотел бы, чтобы Список содержал по одному из каждого тега с этими именами: Бар, Кафе, Ресторан, Паб, Магазин

Как я могу сделать это в Linq?

Спасибо.


person niico    schedule 07.06.2013    source источник
comment
Вам нужны объекты тегов или просто имена тегов?   -  person Bob Vale    schedule 07.06.2013


Ответы (1)


Если вам нужны все уникальные имена тегов, которые вы можете сделать:

places.SelectMany(x => x.Tags).Select(x => x.Name).Distinct()

если два экземпляра одного и того же тега являются одним и тем же объектом, вы можете просто сделать

places.SelectMany(x => x.Tags).Distinct();

если это разные объекты, то вы можете сделать

places.SelectMany(x => x.Tags).GroupBy(x => x.TagId).Select(g => g.First());

ОБНОВЛЕНИЕ после нового комментария.

Добавьте ToList() в конец, чтобы преобразовать результат в список.

places.SelectMany(x => x.Tags).Select(x => x.Name).Distinct().ToList();
places.SelectMany(x => x.Tags).Distinct().ToList();
places.SelectMany(x => x.Tags).GroupBy(x => x.TagId).Select(g => g.First()).ToList();
person Bob Vale    schedule 07.06.2013
comment
Спасибо - получаю эту ошибку: элемент модели, переданный в словарь, имеет тип «System.Linq.Enumerable+‹DistinctIterator›d__811[myapp.Models.Tag]', but this dictionary requires a model item of type 'System.Collections.Generic.List1[myapp.Models.Tag]». - person niico; 07.06.2013