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