2014-09-08 3 views
1

1-0..1 관계의 A와 B 테이블이 2 개 있다고 가정 해 봅시다. 나는 Adapter 접근법을 사용한다. 한 곳에서 A 엔티티 컬렉션을로드 한 다음 나중에 모든 A 엔티티에 대해 관련된 모든 B 엔티티를로드해야합니다. Prefetch를 사용하지 않는 이유는 대부분의 경우 B 엔티티를로드 할 필요가 없기 때문입니다.LLBLGen에서 엔티티 그래프를 병합하는 방법은 무엇입니까?

나는 어디에서나 LINQ를 사용하므로 같은 방식으로하고 싶습니다.

코드

나는 같은 외모를 작성하는 것을 시도하고있다 :

var linqMetadata = new LinqMetaData(adapter) 
{ 
    ContextToUse = new Context() 
}; 

var aCollection = linqMetadata.A.Where(/*some filter*/).ToList(); 

// ... 

var bIds = aCollection.Select(x => x.BId); 
var bCollection = linqMetadata.B.Where(x => bIds.Contains(x.BId)).ToList(); 

문제는 bCollectionaCollection 즉, 연결되지 않은 유지 모든 A 단체가 반대 B = null 등을 가지고있다. 나는이 참조들이 설정되기를 원하며, 따라서 2 개의 그래프가 하나의 하나로 통합되기를 바랍니다.

LINQ to Objects를 사용하여 2 개의 컬렉션을 결합 할 수는 있지만 그다지 우아하지는 않습니다. 그리고 두 컬렉션에 상호 연결이 필요한 복잡한 그래프가 포함되어 있으면 훨씬 더 복잡해 질 수 있습니다.

B에서 A로 프리 페치를 쓸 수 있지만, 이는 완전히 불필요한 추가 DB 쿼리입니다.

이 두 그래프를 병합하는 쉬운 방법이 있습니까?

+0

컬렉션이 "연결 해제 상태를 유지"한다는 것은 무엇을 의미합니까? 테이블 B의 항목을 선택합니다.이 ID는 테이블 A의 필터링 된 버전에있는 레코드로 참조됩니다. 정확히 달성하고자하는 항목은 무엇입니까? – kol

+0

두 번째 쿼리의 마스터 레코드 (A)에 프리 페치 경로를 추가 할 수 있습니까? 나는 그것을 시도하지는 않았지만 질의하지 않고 컨텍스트에서 A 레코드를 얻을 수 있다고 생각합니다. –

+0

@kol .NET 엔티티 사이의 참조가 ID를 기반으로 자동으로 설정되기를 원합니다. 결국 모든 A 엔티티는 non-null'B' 속성을 가지며 그 반대도 마찬가지입니다. 방금 2 개의 쿼리를 실행하면 그렇지 않습니다. 그리고 이것은 llblgen과 EF와 같은 다른 ORM 사이의 큰 차이점 중 하나입니다. –

답변

0

이미 컨텍스트를 사용 중이므로 나중에 PrefetchPath and context을 사용하여 엔티티가 항상 링크 된 방식으로 PrefetchPath를로드 할 수 있습니다. 그런 다음 Linq2Objects 쿼리를 실행하여 모든 B를 메모리에로드 할 수 있습니다.

var bs = aCollection.Select(x => x.B).ToList(); 
+0

각 'A'항목마다 DB 쿼리가 생성됩니다. –

+0

감사합니다. 단락은 추가 데이터가있는 항목을 다시로드하는 것입니다. 즉, 이미 피하려고하는 모든 데이터를 다시 가져와야 함을 의미합니다. 나는 그런 식으로하려고했지만, 불가능하거나, 방법을 알 수 없습니다. 컬렉션을로드하기위한 코드 샘플을 게시 할 수 있습니까? –

1

마스터 엔터티에 대한 할당과 세부 엔터티에 대한 AddRange를 사용하여 관련 엔터티를 추가하면 개체 관계 그래프가 자동으로 작성됩니다. 이 개체 그래프가 완료 수행 한 후

foreach aEntity in aCollection 
    aEntity.BEntity = bCollection.First(x=>x.Id == aEntity.bId); 

OR 

foreach bEntity in bCollection 
    bEntity.AEntity.AddRange(aCollection.Where(x=>x.bId == bEntity.Id)); 

:

여기에 의사 코드 샘플입니다.

+0

늦게 답변을 드려 죄송합니다. 그러나이 방법은 효과가 없습니다. 그래프가 마스터 노드에서 링크 된 경우에만 작동합니다. 그래프에서 공유 노드가 더 깊숙한 경우 링크가 연결되지 않습니다. 이렇게 코멘트를 표현하는 법을 모르겠다 :) –