我对这个Linq
声明感到有点难过。我的基本数据库结构是:
* Event (ID, Name, VenueID)
* Venue (ID, Name)
* EventTag (EventID, TagID)
* VenueTag (VenueID, TagID)
* Tag (TagID, Name)
我得到一个事件列表,每个事件都有一个EventTags列表(其中包含一个标签列表),每个事件都有一个场地,其中有一个场地标签列表,其中有一个标签列表。
我想要得到的是在所有事件之间使用的不同标签列表。
我尝试了一些方法,但我要么得到EventTags
和VenueTags
的列表,这些列表可能包含也可能不包含标签,或者没有...
我的一些尝试(我可能会离开,所以不要笑!):
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一样,把它们放在一起,但没有运气......
提前致谢!
答案 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事件执行该操作并返回包含标记,然后检查返回事件的数量,如果与所有事件的计数相同。
此致