2010-11-16 54 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