3

这是我的情况:

我有艺术家和事件之间的 am:n 关系。我想要做的是获得一个 IQueryable 只包含包含某个艺术家的事件。我正在为我的数据访问层使用存储库。显然,以下方法不起作用:

_db.EventSet.Include("Location").Where(e => (e.Artists.Contains(artist)) && (e.StartDate > System.DateTime.Now)).OrderBy(e => e.StartDate);

由于我是实体框架的新手,我真的不明白为什么,但我可以猜到。因此,如果有人能以非常简单的方式解释这一点,我也将不胜感激。无论如何,我想出的解决方案如下:

IQueryable<Event> events = _db.EventSet.Include("Location").Where(e => (e.EndDate > System.DateTime.Now));
List<Event> eventsList = new List<Event>();
foreach (var ev in events)
{
    eventsList.Add(ev);
}
return (IQueryable<Event>)eventsList.AsQueryable().Where(e => e.Artists.Contains(artist)).OrderBy(e=>e.StartDate);

这根本不是一个好的解决方案,因为所有事件都被检索和处理,这是一个巨大的开销。有没有人可以告诉我一个更好的解决方案来解决我的问题?我也知道我并不真正了解 ObjectQuery 是什么以及如何将其转换为 IQueryable (如果可能的话)。

我很感激任何建议。

4

1 回答 1

2

您可以将Any与 Artist ID 字段一起使用,此处假设名称为ArtistId

_db.EventSet.Include("Location")
            .Where(e => (e.Artists.Any(a => a.ArtistId == artist.ArtistId)) && (e.StartDate > System.DateTime.Now))
            .OrderBy(e => e.StartDate);
于 2010-11-16T17:16:59.790 回答