2013-04-12 79 views
1

我有一種情況如下:LINQ的加入對象列表整數列表

Event: 

public int EventId { get; set; } 
public string EventName { get; set;} 


MediaGallery: 

public int MediaGalleryID { get; set; } 
public string Name { get; set; } 
public List<int> EventId { get; set;} 


List<Event> eventList = query.Event.ToList();  
List<MediaGallery> mediaGallreis = query.MediaGallery.ToList(); 

我需要檢索EVENTLIST是EVENTID存在MediaGallery的事件ID列表。 任何人都可以告訴我嗎?

回答

2

請嘗試以下

var list = eventList 
    .Where(e => mediaGalleries.Any(mg => mg.EventId.Any(id => id == e.EventId))); 

如果mediaGalleriesMediaGallery::EventId名單是足夠大,你可能要考慮一種替代方法。創建一組可能的值並直接查詢該集合

var idSet = new HashSet(mediaGelleries.SelectMany(x => x.EventId)); 
var list = eventList.Where(e => idSet.Contains(e.EventId)); 
1

對於此特定任務,我認爲查詢理解語法將是最合適的。如果我已正確地解決了您的問題,則需要在任何MediaQuery的EventId列表中包含具有ids的所有事件。這裏的LINQ查詢,應該幫助:

var eventList = 
     (from mediaGallery in query.MediaGallery 
      from eventId in mediaGallery.EventId 
      join event in query.Event 
      on eventId equals event.EventId 
      select event) 
     .Distinct() 
     .ToList(); 

它不像其他選項那樣簡單,但我想將其作爲一種替代。

注意從語法中使用double,這對SQL用戶可能看起來很奇怪。如果此語法是不優選的,下面的查詢也應努力:

var eventList = 
     (from event in query.Event 
      where query.MediaGallery.Any(mediaGallery => 
      mediaGallery.EventId.Contains(event.EventId)) 
      select event) 
     .ToList(); 

我喜歡的第一個選項,因爲這些代碼在語法上是複雜的,需要查詢理解語法的理解(來自哪裏,選擇)鏈接語法方法(Any)以及支持(Contains)的事實。

當然,所有這些複雜性都可以用其他代碼替代,所以選擇一個感覺最自然的選項。在我看來,即使是適度複雜的查詢,我也更喜歡查詢理解語法。