Linq使用整数列表连接对象列表

时间:2013-04-12 15:17:45

标签: c# asp.net asp.net-mvc-3 linq lambda

我有一个场景如下:

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

我需要在MediaGallery的eventID列表中检索eventId存在的eventList。 有人可以建议我吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

对于这个特定的任务,我认为查询理解语法是最合适的。如果我正确地处理了您的问题,您需要在任何MediaQuery的EventId列表中包含ID的所有事件。这是一个应该有帮助的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 from语法,这对SQL用户来说可能看起来很奇怪。如果不首选此语法,则以下查询也应该起作用:

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

我更喜欢第一个选项,因为此代码在语法上很复杂,并且需要理解查询理解语法(from,where,select),链接语法方法(Any)以及支持(Contains)这一事实。

当然,所有这些复杂性都可以替换为其他代码,因此请选择对您来说最自然的选项。在我看来,即使是中等复杂的查询,我更喜欢查询理解语法。