Использование Содержит в ObjectQuery - PullRequest
3 голосов
/ 16 ноября 2010

Вот моя ситуация:

У меня есть отношение 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 Ответ

2 голосов
/ 16 ноября 2010

Вы можете использовать Любой с полем 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);
...