2009-09-17 4 views
1

Следующий запрос не удается загрузить таблицы, когда я выполняю его:жадная загрузка в Entity Framework не будет работать на сложном запросе

IEnumerable<Bookmark> tempBookmarks = ListBookmarksByUserID(userID); 
IEnumerable<CandidateWithBookmarks> results = (from c in _internshipEntities.CandidateSet 
              .Include("education") 
              .Include("progress") 
              .Include("contacts") 
              .Include("availability") 
              .Include("hosttypes") 
              .Include("hostsizes") 
              .Include("hostcapacities") 
              .Include("hoststates") 
              .Include("users") 
         join b in tempBookmarks on c.ID equals b.candidates.ID 
         select new CandidateWithBookmarks() 
            {CandidateObject = c, BookmarkObject = b}); 
return results; 

я нашел несколько статей, связанных с проблемой, а именно Alex James' article "How to make Include really Include". Решение поставляется с одной оговоркой:

Для этого, чтобы работать ваши конечные выберите должны быть объекты, т.е. выберите запись, а не выбрать новый {...}

что, очевидно, является проблемой для вышеупомянутого блока код. Существуют ли какие-либо другие известные проблемы, связанные с этой проблемой, которые не нарушают нетерпимую загрузку?

+1

В Entity Framework отсутствует концепция принудительной загрузки. Вы можете запросить загрузку, но вы не можете заставить ее. Вы можете обойти это, но если кто-то еще позже изменит код, вы, скорее всего, вернетесь к квадрату, поэтому убедитесь, что вы проверяете свойство IsLoaded! –

+0

Спасибо за подсказку, что помогает значительно. –

ответ

2

Я думаю, что я решил эту проблему, но она может работать только для этого конкретного экземпляра, передвижения включает в себя после того, как присоединиться, запрос появляется на работу:

IEnumerable<CandidateWithBookmarks> results = (
    from b in tempBookmarks 
    join c in _internshipEntities.CandidateSet 
           .Include("education") 
           .Include("progress") 
           .Include("contacts") 
           .Include("availability") 
           .Include("hosttypes") 
           .Include("hostsizes") 
           .Include("hostcapacities") 
           .Include("hoststates") 
           .Include("users") 
    on b.candidates.ID equals c.ID 
    select new CandidateWithBookmarks(){CandidateObject = c, BookmarkObject = b}); 

Edit: Еще один запрос у меня есть похожий на это требуется внешнее соединение, которое создает некоторые проблемы, так как тогда важно то, к чему вы присоединяетесь, к чему, в отличие от этого примера, но это все еще возможно.

 Смежные вопросы

  • Нет связанных вопросов^_^