2011-08-20 4 views
0

질문 : Hibernate 엔티티 부모가 주어지면 모든 자식을 게으른로드하지 않고 데이터베이스에서 실행하도록 Children 콜렉션에서 LINQ 쿼리를 얻는 방법이 있습니까? 쿼리 수행?LINQ-NHibernate 지연로드를 최적화하는 방법

시나리오 :

부모 개체는 내가 명시 적으로 Expression<Func<Child, bool>>을 전달하려고하면, 나는 그것이 유형 Func<Child, bool>을 기대하고 있다고 오류가 IList의 모음 (어린이)

var parent = _parentRepository.Get(parentId); //loads parent 

..do stuff 

//this causes all Child objects to be loaded into memory 
//and then finds the subset of boy objects (not great performance) 
var boys = parent.Children.Where(t => t.Sex == 1); 

있습니다.

NHibernate를 통해 더 효율적으로 게으른 로딩을 수행 할 수있는 방법이 있습니까?

감사합니다.

답변

1

NHibernate에서 권장되는 방법은 세션을 오래 가지 못하게 유지하여 지연로드를 방지하는 것입니다. "join fetch"(NHibernate 문서 참조)를 적용하여 쿼리의 효율성을 높일 수 있습니다.하지만 모든 자식 객체를 읽을 수는 있지만, 악명 높은 1 + N 반대 패턴이 아닌 한 번에 읽을 수 있습니다.

ChildrenIQueryable이 아니므로 표현식을 사용할 수 없습니다. Linq가 NHibernate를 사용하면 SQL로 변환되는 linq 문을 가진 Session을 질의 할 수있다. 그런 다음 표현식이 술어로 Children 콜렉션을 조회 할 수 있습니다.

+0

그래, 그건 내가 두려워했던거야. 내가 더 효율적인 접근 방식을 설계 한 것보다 더 영리한 사람이되기를 바랬다. – sydneyos

관련 문제