2014-01-20 102 views
1

我对这个Linq声明有点难住。我的基本的数据库结构是: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 

然后我希望做同样的地点,并把它们放在一起,但没有运气...

在此先感谢!

回答

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

非常感谢!很高兴知道我不是一百万英里之外!我几乎没有说我的尝试,因为我认为这会很糟糕。 –

0

首先解决方案,来到我的脑海里,也许它不是最好的之一。

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

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

3-创建CheckIfComon(标签)方法,并检查标签是否存在于所有事件和场地中。 你可以通过foreach事件做到这一点,并返回包含标签,然后检查返回事件的数量是否与所有事件的计数相同。

关注