3

IEnumerable 계산 된 인덱스 필드를 쿼리하는 데 문제가 있습니다. 나는 Sitecore 7.2 upd2, Lucene, ContentSearch 및 PredicateBuilder를 사용합니다.Sitecore 콘텐츠 검색 PredicateBuilder와 IEnumerable

제품 섹션에서 사용할 수있는 제품 가격을 문의하려고합니다. 사용 가능한 제품을 찾기 위해 일부 무거운 Logic이 있으므로 계산 된 필드에 사용 가능한 모든 제품 가격을 입력하기로 결정했습니다. Unfortuantelly 내가 PredicateBuilder 가격 목록을 쿼리 할 수없는 것 같습니다. 인덱스 설정에

predicate = predicate.And(p => p.Prices.Any(x => x >= priceFrom && x <= priceTo)); 

필드 구성 :

<field fieldName="Prices" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.Collections.Generic.IEnumerable`1[System.Int32]" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 

을하고 내 오류입니다 :

내 쿼리는 다음과 같습니다

Invalid Method Call Argument Type: Field - FieldNode - Field: prices -  System.Collections.Generic.IEnumerable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]. Only constant arguments is supported. 

어떤 아이디어?

답변

3

오류는 Any() 메서드 호출의 매개 변수에서 유래합니다.

Sitecore 콘텐츠 검색 LINQ에는 몇 가지 제한 사항이 있습니다. 그 중 하나는 메서드가 매개 변수로 "상수 식"(개체) 만 수락한다는 것입니다. Any 메서드의 매개 변수로 "lamda expression"을 전달하고 있습니다.

+0

그래 그게 것 같다, 나는 또한 일반 .Count()을 시도하고 있었다 - 행운과 함께. 그래서 IEnumerable에 대한 간단한 작업을 여기서는 할 수없는 것처럼 보입니다. –

+0

흠 .. 아마 Any()의 실제 호출과 내가 말한 람다가 아닙니다. – herskinduk

1

인덱스의 개별 계산 필드 (십진수)로 각 제품의 최소 가격과 최대 가격을 모두 인덱싱하는 것이 좋습니다.

이 크게 쿼리를 단순화하는 것 :

var results = context.GetQueryable<ProductSearchResultItem> 
    .Where(p => p.MinPrice >= myPrice) 
    .Where(p => p.MaxPrice <= myPrice) 
    .GetResults(); 
+0

그것은 내 초기 계획 이었지만 :) 섹션의 제품 가격이 {100,200,300}이고 225와 250 사이의 가격을 찾고있는 경우 실패합니다.이 경우 검색은이 섹션을 반환하지 않아야합니다. 그러나 비교를 위해 최대 (300) 및 최소 (100) 가격 만 사용합니다. 어쨌든 고마워! –

+0

Sitecore의 가격은 어떻게 저장되고 제품과 관련이 있습니까? 전자 상거래 모듈과 함께 PriceMatrix 필드를 사용하고 있습니까? 아니면 제품과 연결되는 항목이 서로 다른가요? –

관련 문제