我有一个场景如下:
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。 有人可以建议我吗?
答案 0 :(得分:2)
尝试以下
var list = eventList
.Where(e => mediaGalleries.Any(mg => mg.EventId.Any(id => id == e.EventId)));
如果mediaGalleries
或MediaGallery::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)这一事实。
当然,所有这些复杂性都可以替换为其他代码,因此请选择对您来说最自然的选项。在我看来,即使是中等复杂的查询,我更喜欢查询理解语法。