2

我有一个场景如下:

    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。谁能给我建议?

4

2 回答 2

5

尝试以下

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

如果mediaGalleriesorMediaGallery::EventId列表足够大,您可能需要考虑另一种方法。创建一组可能的值并直接查询该组

var idSet = new HashSet(mediaGelleries.SelectMany(x => x.EventId));
var list = eventList.Where(e => idSet.Contains(e.EventId));
于 2013-04-12T15:19:04.920 回答
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)以及支持(包含)的事实。

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

于 2013-04-12T17:42:45.850 回答