2010-11-16 41 views
3

这是我的情况:在ObjectQuery中使用Contains

我有一个艺术家和事件之间的m: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(如果甚至可能的话)。

我很感激任何建议。

回答

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); 
+0

我没有测试您的查询,但我认为它不工作 – 2010-11-16 18:28:01

+0

@Saeed,为什么不你认为它有效吗?当然,我不知道OP数据库的确切架构,但是我设置了事件,艺术家和位置的数据库,对其进行了测试,并且工作正常。 – 2010-11-16 18:38:37

+0

我认为''(e.Artists.Any(a => a.ArtistId == artist.ArtistId)''无法处理,因为您没有提取的数据来搜索它,只是猜测,它是'EF'如果是AsEnumerable()而没有像我说的那样执行不同的执行,但是在这种情况下,我认为它不能产生sql查询 – 2010-11-16 18:58:31