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 有一些限制。其中之一是方法只接受“常量表达式”(对象)作为参数。您将“lamda 表达式”作为 Any 方法的参数传递。

于 2014-10-09T13:22:57.800 回答
1

我建议将每个产品的最低和最高价格都索引为索引中的单独计算字段(十进制)。

这将大大简化您的查询:

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