2010-08-03 3 views
8

NHibernate 3 alpha 1을 사용하여 모든 컬렉션을 열심히로드하려고합니다. ThenFetch()를 사용하는 것이 올바른지 궁금합니다.ThenFetch()를 사용하여 여러 모음을로드하는 올바른 방법입니까?

복수 이름을 가진 속성은 컬렉션입니다. 나머지는 하나의 객체입니다.

  IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db => 
      from mi in db 
      where mi.RunDate == runDate 
      select mi).Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.PrimaryOwners) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.SecondaryOwners) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.Predecessors) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetch(m => m.Function) 
       .Fetch(mi => mi.Milestone) 
       .ThenFetchMany(m => m.Jobs) 
       .ThenFetch(j => j.Source) 
       ; 

나는 내가 어디에서 금지 구글 그룹에 NHibernate forums하지만 불행히도 접근이 요청 생각했다. 나는 Fabio이 여기에 있다는 것을 안다. 그래서 NHibernate 팀의 사람들이 이것에 대해 어떤 생각을 할 수 있을까? 감사합니다

답변

3

누락 된 한 가지는 FetchMany()를 사용해야한다는 것입니다. ThenFetchMany()는 하위 속성이 컬렉션입니다.

7

분명히 이런 경우에는 ThenFetch을 사용하는 "올바른"방법이 없습니다. 귀하의 예제는 잘 작동하지만 SQL은 Milestone에 대한 많은 조인을 포함하고 있습니다.

Fetch(p => p.B) 
Fetch(p => p.B.C) // if B is not a collection ... or 
Fetch(p => p.B[0].C) // if B is a collection ... or 
Fetch(p => p.B.First().C) // if B is an IEnumerable (using .First() extension method) 

따라서 귀하의 경우는 다음과 같습니다 :

는 사용 대신 IQueryableIQueryOvercomplex syntaxFetch에서 사용할 수 있습니다,

query // = session.QueryOver<X>() 
    .Fetch(mi => mi.Milestone).Eager 
    .Fetch(mi => mi.Milestone.PrimaryOwners).Eager 
    .Fetch(mi => mi.Milestone.SecondaryOwners).Eager 
    .Fetch(mi => mi.Milestone.Predecessors).Eager 
    .Fetch(mi => mi.Milestone.Function).Eager 
    .Fetch(mi => mi.Milestone.Jobs).Eager 
    .Fetch(mi => mi.Milestone.Jobs.First().Source).Eager 
+0

+1이 실제로 작동하는 것을 믿을 수 없습니다. 감사. –

0

레오 라의 말처럼 아이들의 컬렉션을 가져 오는 경우 확인이 당신은

FetchMany() 

ThenFetchMany() 

새로운 가져 오기가 루트에서 선택해야하지만 항상 그런 것은 아닙니다. 때로는 별도의 쿼리로 만들거나 Criteria Futures를 사용하여 여러 페치를 일괄 처리해야 할 때가 있습니다.

0
 IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db => 
     from mi in db 
     where mi.RunDate == runDate 
     select mi); 

var fetch = milestoneInstances.Fetch(f => f.Milestone); 
fetch.ThenFetch(f => f.PrimaryOwners); 
fetch.ThenFetch(f => f.SecondaryOwners); 
//... 
관련 문제