2009-09-17 8 views
1

La requête suivante ne se charge pas les tables quand je l'exécute:chargement Eager Entity Framework échoue sur requête complexe

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; 

J'ai trouvé quelques articles liés au problème, à savoir Alex James' article "How to make Include really Include". La solution est fournie avec une mise en garde:

Pour que cela fonctionne votre sélectionnez final doit être des entités, à savoir sélectionnez après plutôt que de sélectionner de nouveaux {...}

Ce qui est évidemment un problème pour le bloc ci-dessus code. Y a-t-il d'autres solutions de contournement connues pour ce problème qui ne rompra pas le chargement impatient?

+1

Vous pouvez demander un chargement rapide, mais vous ne pouvez pas le forcer. Vous pouvez contourner ce problème, mais si quelqu'un d'autre change le code plus tard, vous êtes probablement de retour à la case départ, alors assurez-vous de vérifier la propriété IsLoaded! –

+0

Merci pour le conseil, cela aide de manière significative. –

Répondre

2

Je pense que je résolu ce problème, mais il pourrait ne fonctionne que pour ce cas précis, en déplaçant le comprend après la jonction, la requête semble fonctionner:

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: Une autre requête J'ai similaire à cela nécessite une jointure externe aussi, ce qui crée quelques problèmes car il importe alors ce que vous joignez à quoi, contrairement à cet exemple, mais c'est encore faisable. Entité Framework n'a pas le concept de chargement forcé impatient.