在ObjectQuery中使用Contains

时间:2010-11-16 15:55:45

标签: c# entity-framework objectquery sql

以下是我的情况:

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

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

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

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(如果可能的话)。

我很感激任何建议。

1 个答案:

答案 0 :(得分:2)

您可以将Any与艺术家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);