2014-06-16 1 views
0

LinqHelper.CreateQuery 방법과 관련하여 실제 문제가 아니라 명확한 질문 유형입니다.Sitecore7 LinqHelper.CreateQuery Buggy?

따라서
이 메서드는 3 오버로드가 있습니다. 여기에 문제의 2 : 1. LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel) 2. LinqHelper.CreateQuery<SearchResultItem>(searchContext, searchStringModel, startLocationItem) 는 [내가 여기에 추가 컨텍스트를 사용하므로 기본 null을 사용하지 않은] 특정에 함께 항목을 검색하기 위해 지금

,
을 컨텐츠 트리의 위치 I 쿼리를 사용하는 방법 1을 사용할 수 있습니다 (특정 폴더 아래에 예를 들어, 당신은 1000 개 항목이) :

query = "location:{FOLDER_GUID};+custom:my_filed_name|bla_bla" 

완벽하게 작동합니다. 하지만 또한 다음과 같은 방법 2를 사용 할 수 있어야한다 (필자는 메소드 서명에서 이해 것과가 있다는 것입니다) :

SitecoreIndexableItem folderID = SitecoreIndexableItem)contextDatabase.GetItem({FOLDER_GUID}); 
var index = ContentSearchManager.GetIndex(new SitecoreIndexableItem(Sitecore.Context.Item)); 
using (var context = index.CreateSearchContext()) 
{ 
    List<SearchStringModel> searchStringModel = new List<SearchStringModel>(); 
    searchStringModel.Add(new SearchStringModel("my_field_name", "bla_bla")); 
    List<Sitecore.Data.Items.Item> resultItems = LinqHelper.CreateQuery(context, searchStringModel, folderID).Select(toItem => toItem.GetItem()).ToList();     
} 

문제는 위의 방법입니다 (방법 2) 검색은, 무엇을 잘 작동 작동하지 않습니다 "startLocationItem"(이 경우 folderID)입니다. 예를 들어

,
내 전체 sitecore 트리에서가 포함 총 3 개 항목이있는 경우 "my_filed_name = bla_bla"하지만, 단 1 항목 "my_filed_name = bla_bla을"폴더 ({FOLDER_GUID}에 포함
, startLocationItem FOLDER_GUID = {} "에도 불구하고,이 경우의"perticular 폴더 ") THEN
,
방법 되돌아 CORRECT 1 개 항목() 그러나 방법 2 반환 항목 3, ... (I 해달라고 WHICH 생각이 맞음)

질문 :
1. 방법 1에서 "startLocationItem"의 정확한 목적은 무엇입니까?
2. "위치"필터 또는 "방법 2에 대해 startLocationItem"을 사용하면 어떤 이점이 있습니까?

답변

1

LinqHelper는 내부 도우미 클래스이며 은 정상적으로 작동 할 때을 사용하지 않아야합니다. Sitecore UI가 검색 백엔드와 대화하는 것을 돕기위한 것입니다. 구문은 언제든지 변경 될 수 있으므로 잠재적으로 구문을 기반으로 손상 될 수 있으며 문서화되지도 않습니다.

당신은

using (var context = index.CreateSearchContext) 
{ 
    context.GetQueryable<SearchResultItem>().Where(x =>x.Paths.Contains(ID.Parse("your GUID Here"))) 
} 

LinqHelper 문자열의 '위치', 즉 보통의 LINQ 쿼리에 검색어를 변환하는 더 나은 것 인덱스에 저장된 경로 (또는 _path) 필드에 해당합니다.

이 필드는 항목의 모든 상위 항목 목록을 포함하며 GUID 목록으로 유지됩니다. 해당 항목 검색을 당신이 동물 필터링 (예 : 5678)은 제한하는 경우

/home (id:1234) 
    /animals (id:5678 = path:1234/5678 
     /cats (id:1111) = path: 1234/5678/1111 
     /dogs (id:2222) = path: 1234/5678/2222 
    /cars (id:4567) = path: 1234/4567 
     /sports (id:3333) = path: 1234/4567/3333 

: 예를 들어, 당신은 점수를 초래하지 않고 트리의 특정 노드에 쿼리를 제한 _path에 의해 필터링함으로써

및 그것의 아이들.이 단지의 일부 내부 검색 할

using (var context = index.CreateSearchContext) 
{ 
    context.GetQueryable<SearchResultItem>().Where(x =>Name.Contains("Exciting")) 
      .Filter(y => y.Paths.Contains(ID.Parse("your GUID Here") 
} 

: 필터를 사용

메인 쿼리의 득점을 초래 부분이없는 검색의 컨텍스트를 제한 할 수 있습니다, 그래서 당신은 끝낼 것이다 의미 트리 이름에 '흥미 진진한'이름이 들어있는 경우 필터링했습니다.

도움이 되길 바랍니다. :)

+0

고마워 스티븐 ... 정확히 내가 무엇을 찾고 있었습니까. 매우 도움이됩니다. –

+0

안녕하세요. Stephen, LinqHelper를 통해 Sitecore에 LINQ를 사용하는 것이 매우 중요합니다. 나는 그것에 관한 질문을 하나 더 가지고있다. : LinqHelper.CreateQuery를 사용하여 데이터 소스 쿼리를 구문 분석하고 있는가? 마찬가지로 : var query = LinqHelper.CreateQuery (context, SearchStringModel.ExtractSearchQuery (queryString)) .Select (toItem => toItem.GetItem()). Take (10); 이 방법이 Sitecore 7에서 sitecore 7.2 rev로 어떻게 변경되었는지 확인했습니다. 가장 좋은 방법이 궁금합니다. 많은 감사가 전진합니다. –

관련 문제