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

Entity Framework は、部分的に完成したインスタンスを具体化することはありません。つまり、 ChildLocations の一部だけで Location を実体化することはできません。これは「不完全な」オブジェクトであり、Entity Framework はこれを許可しません。

ただし、回避策があります。Location 自体からではなく、ChildLocations からの情報のみが必要な場合は、それを選択します。

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

この場合、ChildLocations のみを選択しているので、それらは完全に実体化できるため、そのうちのいくつかを選択するだけで問題ありません。すべての子が必要になるのは、場所を具体化するときだけです。

別の回避策は、部分的な位置情報を匿名型に具体化することです。これにより、インスタンスは完全な形式でのみ実体化できるという規則に違反することなく、Location と一部の 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 に答える