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을 읽었지 만 실제로 볼 수있는 한 해결책을 제공하지는 않습니다.
아이디어가 있으십니까?
하위 카테고리를 Ajax 요청으로 끌어 오면 (캐시 된) 사용자가 첫 번째 페이지로드시 모두 클라이언트로 내려 보내는 대신 실제로 마우스를 가져 가면 되나요? 수천이 있다면 (말한대로) 불필요한 마크 업을 많이 보낼 수 있습니다. – R0MANARMY
참. 갈 수있는 좋은 방법일지도 모릅니다. 이 질문에 답을하지 않은 것은 부끄러운 일입니다. 의견을 수락 한 것으로 표시 할 수 없음) – autonomatt
질문 자체에 대한 답변이 아니 었습니다. 다른 접근 방법에 대한 제안이었습니다. 이렇게하면 자식 요소를 제대로로드하려고하는 다른 사람이 유용한 답변을 찾을 수 있습니다. – R0MANARMY