2012-10-06 2 views
1

당신의 생각에 감사드립니다.Linq to 엔티티 TPC 및 열심히로드하는 하위 클래스 관계

저는 먼저 엔티티 프레임 워크 5.0을 사용하고 있습니다.

테이블은 클래스 당 테이블 (또는 구체적인 유형 당 테이블) 패턴을 사용하여 매핑됩니다.

표 A 1..Many (추상) 표 B

표 B가 2 개 자식 클래스

B1 & B2

B2는 3 테이블에 외래 키를 가지고의 표 C를 가정 해 봅시다 (많은 B2 ... 1 C), 그러나 이것은 부모 클래스 B의 속성이 아닙니다.

열망로드가 응용 프로그램의 기본값이며, 테이블에 쿼리 할 때 테이블 (또는 컬렉션) C를 포함하고 싶습니다. B2 - 이에 상응하는 (pseudo linq to entiti ES) :이 테이블

답변

2

문제의 마음의 열망 부하를 강제 할 수있는 방법에 대한 어떤 생각을위한

from A in _db.A 
.Include(A=>A.B.OfType<B2>()) 
.Include(A=>A.B.OfType<B2>().Include(C)) 
select A 

감사 Include(A=>A.B.OfType<B2>())가 지원되지 않는 것입니다.

필자가 ADO.Net 팀을 이해한다면 부분적으로로드 된 하위 모음을 지원하지 않는 것으로 보입니다. (그리고 나는 그것들에 동의하는 경향이있다.) Linq-to-SQL에는 DataLoadOptions이 있었지만 EF와 동등한 것은 없다. 이는 B의 콜렉션을 부분적으로로드하도록 EF에 지시 할 것이므로 이 OfType 인 이유를 설명 할 수 있습니다.

또한 확장 메서드 IncludeIQueryable 개체 자체의 Include 메서드 (있는 경우) 주위의 래퍼입니다. ObjectQuery.Include을 가져 오십시오 : 포함시킬 탐색 속성에 대한 경로가 포함 된 매개 변수 (DbQuery.Include과 같음) (_db.A.Include("B"))와 같은 문자열을 사용하는 아주 간단한 방법입니다. 즉, MemberExpression으로 해석 될 수있는 문자열 만 사용할 수 있습니다. 그리고 B.OfType<>()이 방법입니다.

C을 포함 할 수없는 이유를 설명하는 긴 이야기 : C으로 이어지는 경로는 유효하지 않습니다.

당신

_db.B.OfType<B2>().Include(b => b.A).Include(b => b.C) 

을 할 수 그러나 그것은 당신이 후했던 결과를 제공하지 않을 수 있습니다.

+0

감사합니다. 잘 대답 했으므로 궁금한 점이 없으므로 문제를 해결하기 위해 많은 시간을 절약 할 수 있습니다. TPC 상속은 연관된 부분 클래스에서 많은 공통점을 재사용하는 데 사용되었지만 OfType 포함을 사용할 수 없기 때문에 대신 인터페이스와 확장 메소드를 구현해야한다고 생각합니다. – Brent