Entity Framework에서 동작에 대한 설명서를 찾으려고합니다. 그것은 작동하지만,이 동작에 의존하기 전에, 나는 이것이 EF의 정상적인 동작이고 미래 버전에서 "고정"될 예상치 못한 부작용이 아닌지 확인하고자합니다. 여기에 상황이 있습니다 :동작 Entity Framework에서 설명 할 수 없습니다.
나는 꽤 심오한 오브제를 가지고 있습니다. 이 구조는 여러 레벨의 객체 컬렉션입니다 (클래스 A는 클래스 C의 콜렉션을 포함하는 클래스 B의 콜렉션을 포함하며, 여기에는 ...이 포함됩니다).
C의 일부 속성에서 요소를 필터링해야하고 전체 hierachy를로드하는 첫 번째 테스트에서 복잡한 LINQ 쿼리 (유지 관리의 어려움)가 발생하고 생성 된 SQL 쿼리가 효율적이지 않습니다. 이 모든 것을 단순화하기 위해 두 단계로 쿼리를 분할하기로했습니다. 먼저 원하는대로 필터링 된 클래스 C (및 모든 하위 항목) 컬렉션을로드 한 다음 포함 된 B의 모든 인스턴스에 대해 클래스 A와 B를로드합니다.
다음은 catch입니다.이 기술을 사용하여 B 클래스의 C 컬렉션을 수동으로 다시 채워야하지만 실제적으로 컬렉션에는 이미 컬렉션 요소가 채워져있을 것으로 예상됩니다. . intellitrace에서 SQL 쿼리를 확인했고 C의 인스턴스를 채우는 데 필요한 데이터가 두 번째 쿼리에 포함되지 않았으므로 EF가 컨텍스트의 정보에서 수행 한 유일한 논리적 결론이었습니다. BTW, 해당 컨텍스트에 대한 지연로드가 해제되어 있습니다.
EF에서이 동작이 정상입니까? 그래서, 어떻게 작동하는지 설명하는 문서에 대한 링크를 줄 수 있습니까?
using(var context = new MyContext())
{
//Includes and where clauses are greatly simplified for the purpose of the sample
var filteredC = context.C.Include(x=>x.ListOfD).Include(x=>x.ListOfD.Select(y=>y.ListOfE)).Where(c=>c.Status==Status).ToList();
int[] bToLoad = filteredC.Select(c=>c.IDofB).Distinct().ToArray();
var listOfAAndB = context.A.Include(a=>a.ListOfB).Where(x=>x.ListOfB.Any(y=>bToLoad.Contains(y.ID))).ToList();
//At this step, I expected B.ListOfC to be empty but it's somehow populated
}
감사
어떤 버전의 EF도 참고 하시겠습니까? –
게으른로드를 사용하고 있습니까? – Gavin
게으른 로딩이 없음 (질문에 지정됨) –