1

想象一下这种情况:

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

此查询将加载类型 == 3 的所有位置以及所有相关的子位置,好的。但我想弄清楚的是如何过滤正在加载的子位置。如果位置有 300 万个子位置怎么办?

也许是这样的?(不起作用,因为 ChildLocations 是一组实体)

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

谢谢你。

4

1 回答 1

4

实体框架永远不会实现部分完成的实例。换句话说,你不能用它的一些ChildLocations 来实现一个 Location。这将是一个“不完整”的对象,实体框架不允许这样做。

但是,有一些解决方法。如果您只需要来自 ChildLocations 而不是来自 Location 本身的信息,只需选择:

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

在这种情况下,由于我们只选择 ChildLocations,因此只选择其中的几个是可以的,因为它们可以完全实现。只有在实现位置时,我们才需要所有的孩子。

另一种解决方法是将部分位置信息具体化为匿名类型。这使您可以获取有关位置和某些ChildLocations 的信息,而不会违反实例只能以其完整形式实现的规则。由于您实际上并没有具体化一个真实的位置,因此不需要具体化整个事物:

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
}
于 2009-03-23T14:13:48.077 回答