3

IEnumerable 計算インデックス フィールドのクエリに問題があります。Sitecore 7.2 upd2、Lucene、ContentSearch、および PredicateBuilder を使用しています。

製品セクションで利用可能な製品価格を照会しようとしています。利用可能な製品を見つけるための重いロジックがいくつかあるので、利用可能なすべての製品価格を計算フィールドに入れることにしました。残念ながら、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.

何か案は?

4

2 に答える 2

3

Any()エラーは、メソッド呼び出しのパラメーターに起因します。

Sitecore コンテンツ検索 LINQ にはいくつかの制限があります。それらの 1 つは、メソッドがパラメーターとして「定数式」(オブジェクト) のみを受け入れることです。Any メソッドのパラメーターとして「ラムダ式」を渡しています。

于 2014-10-09T13:22:57.800 に答える
1

各製品の最小価格と最大価格の両方を、インデックス内の個別の計算フィールド (10 進数) としてインデックス化することをお勧めします。

これにより、クエリが大幅に簡素化されます。

var results = context.GetQueryable<ProductSearchResultItem>
    .Where(p => p.MinPrice >= myPrice)
    .Where(p => p.MaxPrice <= myPrice)
    .GetResults();
于 2014-10-09T15:10:10.030 に答える