2014-01-20 98 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事件做到這一點,並返回包含標籤,然後檢查返回事件的數量是否與所有事件的計數相同。

關注