Linq to Entities - 获取所有唯一相关实体的列表

时间:2013-06-07 12:15:17

标签: asp.net-mvc linq asp.net-mvc-4 linq-to-entities sql-server-2012-express

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; }

和相关的Tag模型:

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; }
他们有很多关系。

我有一个List位置 - 我想创建一个List标签 - 填充与'places'中每个位置相关联的每个(唯一)标签。

例如,一个地方可能有'restaurant'和'pub'标签,另一个'pub'和'bar',另一个'shop'和'cafe'。

我希望List包含这些名称中的每个标记之一: 酒吧,咖啡厅,餐厅,酒吧,商店

我如何在Linq中执行此操作?

感谢。

1 个答案:

答案 0 :(得分:0)

如果您想要所有唯一标签名称,您可以这样做:

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();