2011-03-11 3 views
1

1000 개의 카테고리가있는 웹 사이트가 있습니다. 나는 루트 카테고리를 나열하고 hover에서 하위 카테고리 (그리고 아마도 한 레벨 더)를 보여주는 메뉴를 만들고있다. 나의 불꽃보기에서Spark View Engine에서 메뉴를 빌드 할 때 NHibernate N + 1 문제 ASP.NET MVC

나는이있다 : 내 카테고리 저장소에서

<ul class="menu"> 
     <li each="var category in categories"> 
      ${Html.ActionLink(category.Name, "Index", "Category", new {id=category.Id}, new {@class="drop"})} 
      <div class="dropdown_1column"> 
       <div class="col_1 firstcolumn"> 
        <ul class="levels"> 
         <li each="var subcategory1 in category.ChildCategories"> 
          ${Html.ActionLink(subcategory1.Name, "Index", "Category", new {id=subcategory1.Id}, new {@class="drop"})}        
         </li> 
        </ul> 
       </div> 
      </div> 
     </li> 
    </ul> 

을 나는이있다 :

var categories = session.CreateCriteria(typeof(Category)) 
       .Add(Restrictions.IsEmpty("ParentCategories")).Add(!Restrictions.Eq("Name", "Hide")) 
       .AddOrder(Order.Asc(sortBy)) 
       .SetFetchMode("ParentCategories", FetchMode.Eager) 
       .List<Category>(); 

내가 NHProfiler에 N + 1 경고를 받고 있어요을 때 스파크보기 엔진 하위 카테고리를 반복합니다. 하위 카테고리는 lazyload'ed이기 때문에 Hibernate는 각 루트 카테고리의 모든 하위 카테고리에 대해 select를 실행합니다. ChildCategories FetchMode를 Eager로 설정하면 NH가 분명히 거대한 선택을하게하는 각 하위 카테고리 아래로 탐색합니다. 나는 열망하는로드를 필요로하는 하위 카테고리에만로드하거나 한 번의 왕복으로 포함시킬 방법을 찾고 있습니다.

나는 this post을 읽었지 만 실제로 볼 수있는 한 해결책을 제공하지는 않습니다.

아이디어가 있으십니까?

http://samscode.com/index.php/2010/01/eager-fetch-multiple-child-collections-in-1-round-trip-with-nhibernate/

+1

하위 카테고리를 Ajax 요청으로 끌어 오면 (캐시 ​​된) 사용자가 첫 번째 페이지로드시 모두 클라이언트로 내려 보내는 대신 실제로 마우스를 가져 가면 되나요? 수천이 있다면 (말한대로) 불필요한 마크 업을 많이 보낼 수 있습니다. – R0MANARMY

+0

참. 갈 수있는 좋은 방법일지도 모릅니다. 이 질문에 답을하지 않은 것은 부끄러운 일입니다. 의견을 수락 한 것으로 표시 할 수 없음) – autonomatt

+0

질문 자체에 대한 답변이 아니 었습니다. 다른 접근 방법에 대한 제안이었습니다. 이렇게하면 자식 요소를 제대로로드하려고하는 다른 사람이 유용한 답변을 찾을 수 있습니다. – R0MANARMY

답변

1

당신은 아이들의 여러 수준을로드 HQL을 사용할 수 있습니다. 이 방법

var categoriesQuery = session.CreateQuery(@"select cat from Category cat join fetch cat.Children subCat join fetch subCat.Children").Future<Catgory>(); 

categoriesQuery.ToList(); // exec 

한 가지주의해야 할 점은 그들이 자산과 매핑하지 않는 경우 당신은 당신의 외부 목록의 중복을 얻을 수 있도록 NH 데이터베이스 결과 사실이다.

그렇지 않은 경우 향후 방법을 사용하여 각 쿼리를 개별적으로 실행할 수 있습니다. 그들은 여전히 ​​배치 될 것입니다.

+0

유망하지만, 결국 소렌에서는 작동하지 않았습니다. – autonomatt