2013-05-10 1 views
0

Orchard의 Projections 모듈에 다음과 같은 문제가 있습니다.
Orchard가 아닌 데이터베이스를 열 때 별도의 응용 프로그램에서 가져온 데이터베이스를 열 때 주 범주가있는 페이지가 있습니다.) 하위 범주 및 해당 하위 범주의 항목에 대한 것입니다.Orchard 투영이 수백 개의 쿼리를 실행하지 못하도록하는 방법

쉽게 탐색 할 수 있도록 위젯에 주요 카테고리 제목을 표시하는 프로젝션이 있습니다. 그러나 페이지로드 시간은 급격히 늘어납니다. 예상치에도 각 주 카테고리를 전체적으로로드하려고 시도하기 때문에 두 번째 데이터베이스에 대해 기하 급수적 인 쿼리가 발생하고로드 시간이 30 초를 초과합니다.

투영 모듈에서 제목 부분 (및 모든 사용자 지정 바인딩)을 쿼리하고 해당 쿼리를 실행하는 부분을 무시할 수 있습니까? 사전에

감사합니다.

편집

우리는 미니 프로파일 러를 사용하고이 결과 :
mini-profiler output

문제가 줄에 Orchard.Projections.Drivers.ProjectionPartDriver의 표시 방법 것 같다 111 :

var contentItems = _projectionManager.GetContentItems(query.Id, pager.GetStartIndex() +  part.Record.Skip, pager.PageSize).ToList(); 

어떻게해야합니까?

답변

1

이 N + 1 쿼리 문제는 일부 파트의 레코드가 느리게로드된다는 사실에 기인한다고 생각합니다. 따라서 액세스 된 각 파트에 대해 각 가져온 항목에 대해 하나의 후속 쿼리가 생성됩니다. ContentQuery와

는 QueryHints 열심히 당신이 (= 열망로드) 테이블에 참여하기 위해 가입() 메소드를 사용할 수 IHqlQuery (프로젝터 필터에 사용 된 쿼리)와 일부 기록을로드 할 수있다. 그러나 코드를 작성해야합니다. 테이블에 조인하는 프로젝터 필터 공급자를 만든 다음이 필터를 각각의 쿼리와 함께 사용합니다.

나는 프로젝터를 열망하는 더 간단한 옵션에 대해서는 잘 모르고 있지만 탐험할만한 가치가있다. 이 문제에 대해 왜 열어 보지 않으시겠습니까?

+0

문제는 Orchard 자체가 사용하는 것처럼 NHibernate가 아니라 Entity Framework를 사용한다는 것입니다. 로드 된 부분은 Entity Framework에서 (관리자를 통해) 많은 쿼리를 실행합니다. 나는 이제 캐싱을 시도하고있다. 필터를 사용하여 제목 부분 이외의 항목을로드하는 것을 방지 할 수 있습니까? 문제는 무엇으로보고해야합니까? – Ytrog

+1

속성에 액세스 한 부분 만로드됩니다. 대부분의 경우 이것은 뭔가를 표시하는 부분 만로드된다는 것을 의미합니다. Placement.info로 Parts_Title을 제외한 모든 것을 숨기면 대부분이 문제가 해결됩니다. Projector 쿼리에 대한 eager-loading 부분 레코드에 관한 문제를 만들려고 생각했습니다. – Piedone

+0

눈에 보이지 않는 곳에도 placement.info로 숨길 수 있습니까? – Ytrog