46 votes

Linq-to-organismes - méthode include() ne charge pas

Si j'utilise une jointure, la méthode include() ne fonctionne plus, par exemple:

from e in dc.Entities.Include("Properties")
join i in dc.Items on e.ID equals i.Member.ID
where (i.Collection.ID == collectionID) 
select e

e.Properties n'est pas chargé

Sans la jointure, la fonction include() fonctionne

Lee

54voto

Alex James Points 15939

Mise à JOUR: en Fait, j'ai récemment ajouté une autre Astuce que couvre le présent, et fournit une autre probablement la meilleure solution. L'idée est de retarder l'utilisation de Include() jusqu'à la fin de la requête, voir ce pour plus d'information: Astuce 22 - Comment faire inclure inclure


Il est connu de prescription dans le Cadre de l'Entité lors de l'utilisation de Include(). Certaines opérations ne sont tout simplement pas pris en charge Comprennent.

On dirait que vous avez exécuté dans un sur ces limitations, pour contourner cela, vous devriez essayer quelque chose comme ceci:

var results = 
   from e in dc.Entities //Notice no include
   join i in dc.Items on e.ID equals i.Member.ID
   where (i.Collection.ID == collectionID) 
   select new {Entity = e, Properties = e.Properties};

Cela va ramener les Propriétés, et si la relation entre l'entité et de Propriétés est un un-à-plusieurs (mais pas un de plusieurs à plusieurs), vous constaterez que chaque type anonyme a les mêmes valeurs:

anonType.Entity.Properties
anonType.Properties

C'est un effet secondaire d'une fonctionnalité dans le Cadre de l'Entité appelée relation de correction.

Voir cette Astuce 1 dans mon EF Conseils de série pour plus d'informations.

Alex

20voto

Bryan2010 Points 121

Essayez ceci:

var query = (ObjectQuery<Entities>)(from e in dc.Entities
            join i in dc.Items on e.ID equals i.Member.ID
            where (i.Collection.ID == collectionID) 
            select e)

return query.Include("Properties") 

4voto

Craig Stuntz Points 95965

Alors, quel est le nom de la propriété de navigation sur "Entité" qui se rapporte à "le Point.Membre" (c'est à dire, l'autre extrémité est de la navigation). Vous devriez être en utilisant ce au lieu de la rejoindre. Par exemple, si "l'entité" ajouter une propriété nommée Membre de la cardinalité de 1 et Membre avait une propriété appelée Éléments avec une cardinalité de nombreux, vous pourriez faire ceci:

from e in dc.Entities.Include("Properties")
where e.Member.Items.Any(i => i.Collection.ID == collectionID) 
select e

Je devine que les propriétés de votre modèle ici, mais ce devrait vous donner une idée générale. Dans la plupart des cas, l'utilisation de joindre dans LINQ to entities est faux, parce qu'il suggère que soit votre navigation propriétés ne sont pas configurés correctement, ou vous n'êtes pas les utiliser.

0voto

mhenrixon Points 3178

Une fois encore, je voudrais vous recommandons de Linq pad. Aide à vérifier si c'est vraiment le Comprennent qui est le problème. J'en doute.

-1voto

Tomas Lycken Points 23432

Essayez le plus verbeux pour faire plus ou moins la même chose que d'obtenir les mêmes résultats, mais avec plus de datacalls:

var mydata = from e in dc.Entities
             join i in dc.Items 
                 on e.ID equals i.Member.ID 
             where (i.Collection.ID == collectionID) 
             select e;

foreach (Entity ent in mydata) {
    if(!ent.Properties.IsLoaded) { ent.Properties.Load(); }
}

Ne vous obtenez toujours le même (inattendue) résultat?

EDIT: modification de la première phrase, qu'elle était incorrecte. Merci pour le pointeur de commentaire!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X