Linq - 从列表对象中选择标记列表,每个列表对象都包含一个标记列表

时间:2014-01-20 12:08:00

标签: c# linq list

我对这个Linq声明感到有点难过。我的基本数据库结构是:

* Event (ID, Name, VenueID)
* Venue (ID, Name)
* EventTag (EventID, TagID)
* VenueTag (VenueID, TagID)
* Tag (TagID, Name)

我得到一个事件列表,每个事件都有一个EventTags列表(其中包含一个标签列表),每个事件都有一个场地,其中有一个场地标签列表,其中有一个标签列表。

我想要得到的是在所有事件之间使用的不同标签列表。

我尝试了一些方法,但我要么得到EventTagsVenueTags的列表,这些列表可能包含也可能不包含标签,或者没有...

我的一些尝试(我可能会离开,所以不要笑!):

 var tags = events.Select(x=>x.EventTag.Select(x=>x.Tag)).Union(events.Select(y=>y.Venue.VenueTag.Select(z=>z.Tag))).Distrinct().ToList()

或者

var tags1 = (from y in (from x in events where events.EventTags.Count > 0 select x) select y.Tag).ToList

我当时希望与Venue一样,把它们放在一起,但没有运气......

提前致谢!

2 个答案:

答案 0 :(得分:1)

你第一次非常接近 - 只需要SelectMany代替Select来获取每个实体的所有标签:

events.SelectMany(x => x.EventTag).Select(et => et.Tag)
      .Union(events.SelectMany(x => x.Venue.VenueTag).Select(vt => vt.Tag))
      .Distrinct().ToList();

答案 1 :(得分:0)

我想到的第一个解决方案,也许它不是最好的解决方案。

1-将所有标签列表作为不同列表。  var tags = Tag.Distinct()。ToList();

2- var comonTags = tags.ForEach(tag => CheckIfComon(tag));

3-创建方法CheckIfComon(标签),并检查标签是否存在于所有事件和场地中。 您可以通过foreach事件执行该操作并返回包含标记,然后检查返回事件的数量,如果与所有事件的计数相同。

此致