Стремительная загрузка с Include () - PullRequest
1 голос
/ 21 марта 2009

Представьте себе этот случай:

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

Этот запрос загрузит все местоположения с типом == 3 и все связанные дочерние местоположения, хорошо. Но я пытаюсь понять, как фильтровать загружаемые дочерние местоположения. Что, если у местоположения есть 3 миллиона дочерних местоположений?

Может быть, что-то подобное? (не работает, потому что ChildLocations представляет собой набор сущностей)

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

Спасибо.

1 Ответ

4 голосов
/ 23 марта 2009

Entity Framework никогда не материализует частично завершенный экземпляр. Другими словами, вы не можете материализовать Локацию только с некоторыми ее дочерними локациями. Это будет «неполный» объект, и Entity Framework не допускает этого.

Однако есть обходные пути. Если вам нужна информация только из ChildLocations, а не из самого Location, просто выберите это:

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

В этом случае, поскольку мы выбираем только дочерние расположения, можно выбрать только несколько из них, поскольку они могут быть полностью материализованы. Только при материализации Места нам нужно всех детей.

Другим обходным решением является материализация частичной информации о местоположении в анонимный тип. Это позволяет вам получать информацию как о местоположении, так и о некоторых дочерних локаций, не нарушая правила о том, что экземпляры могут быть материализованы только в их полной форме. Поскольку вы на самом деле не материализуете реальное Место, нет необходимости материализовать все это:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...