2009-03-21 2 views
1

はこのケースを想像して()を含めます。しかし、私が把握しようとしているのは、ロードされている子の場所をフィルタリングする方法です。場所に3百万の子供の場所がある場合はどうなりますか?イーガーローディングは

多分このような何か? (ChildLocationsはエンティティの集合であるため、機能しません)

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

ありがとうございます。

答えて

4

Entity Frameworkは、部分的に完全なインスタンスを実現することはありません。言い換えれば、の子ロケーションのだけを持つ場所を実現することはできません。これは「不完全な」オブジェクトであり、Entity Frameworkはこれを許可しません。

ただし、回避策があります。あなたが唯一の場所自体からChildLocationsないから情報が必要な場合は、ちょうどそれを選択:我々は唯一のChildLocationsを選択しているので、この場合は

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

を、それらのいくつかを選択するだけにOKですそれらは完全に実現することができるからです。私たちが必要とする場所を具体化するときだけですすべて子供たち。

もう1つの回避策は、部分的な位置情報を匿名型に具体化することです。これにより、場所との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 
} 
+0

いい説明、ありがたいです。 –