C# Linq将对象列表与整数列表联接

C# Linq将对象列表与整数列表联接,c#,asp.net,asp.net-mvc-3,linq,lambda,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> even

我有一个场景如下:

    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();
事件:
public int EventId{get;set;}
公共字符串EventName{get;set;}
媒体画廊:
公共int MediaGalleryID{get;set;}
公共字符串名称{get;set;}
公共列表事件ID{get;set;}
List eventList=query.Event.ToList();
List mediaGallreis=query.MediaGallery.ToList();
我需要检索一个eventId存在于MediaGallery的eventId列表中的eventList。 有人能给我建议吗?

试试下面的方法

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

如果<代码>媒体> <代码>或代码> MealGalays::Evutd列表足够大,您可能需要考虑另一种方法。创建一组可能的值,并直接查询到该值集中

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

对于这个特定的任务,我认为查询理解语法是最合适的。如果我正确解释了您的问题,那么您需要在任何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)的事实

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