2009-03-21 8 views
1

Imaginer ce cas:chargement Désireuse avec Include()

var locations = from Locations in this.LocationDataContext.Locations 
             .Include("ChildLocations")      
       where 
        (Locations.LocationType.ID == 3) 
       select 
        Locations; 

Cette requête chargera tous les emplacements de type == 3 et tous les emplacements enfants connexes, ok. Mais ce que j'essaie de comprendre, c'est comment filtrer les emplacements des enfants chargés. Que se passe-t-il si l'emplacement a des emplacements enfants 3milion?

Peut-être que quelque chose comme ça? (Travail ne marche pas parce que ChildLocations est un ensemble d'entités)

var locations = from Locations in this.LocationDataContext.Locations 
             .Include("ChildLocations")      
       where 
        (Locations.LocationType.ID == 3) && 
        (Locations.ChildLocations.LocationType.ID == 2) 
       select 
        Locations; 

Merci.

Répondre

4

Entity Framework ne matérialisera jamais une instance partiellement terminée. Vous ne pouvez pas, en d'autres termes, matérialiser un emplacement avec seulement certains de ses ChildLocations. Ce serait un objet "incomplet", et Entity Framework ne le permet pas.

Cependant, il existe des solutions de contournement. Si vous avez seulement besoin d'informations des ChildLocations et non de l'emplacement lui-même, il suffit de sélectionner que:

from Locations in this.LocationDataContext.Locations 
where Locations.LocationType.ID == 3 
from ChildLocation in Locations 
where ChildLocation.LocationType.ID == 2 
select ChildLocation; 

Dans ce cas, puisque nous ne sélectionnons les ChildLocations, il est OK pour sélectionner uniquement certains d'entre eux, puisqu'ils peuvent être matérialisés complètement. Ce n'est que lors de la matérialisation de l'emplacement que nous avons besoin tous les des enfants.

Une autre solution consiste à matérialiser des informations de localisation partielles dans un type anonyme. Cela vous permet d'obtenir des informations à la fois sur l'emplacement et certains des ChildLocations sans enfreindre la règle selon laquelle les instances ne peuvent être matérialisées que dans leur forme complète. Étant donné que vous ne matérialisez pas réellement un emplacement réel, il n'y a aucune exigence de matérialiser le tout:

from Locations in this.LocationDataContext.Locations 
where Locations.LocationType.ID == 3 
select new 
{ 
    ID = Locations.ID, 
    LocationType= Locations.LocationType 
    ChildLocations = from ChildLocation in Locations 
        where ChildLocation.LocationType.ID == 2 
        select ChildLocation 
} 
+0

Belle explication, merci. –