3

我遇到了查询IEnumerable计算索引字段的问题。我使用Sitecore 7.2 upd2,Lucene,ContentSearch和PredicateBuilder。Sitecore内容搜索PredicateBuilder与IEnumerable

我想查询产品的价格为根据产品部分找到。有一些沉重的逻辑找到可用的产品,所以我决定把所有可用的产品价格放在计算领域。不幸的是,它看起来像我无法用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有一些限制。其中之一是该方法只接受“常量表达式”(对象)作为参数。您正在传递“lamda表达式”作为Any方法的参数。

+0

是的,这似乎是吧,我也想简单的.Count中() - 没有运气。所以看起来我不能在IEnumerable上做任何简单的操作。 – 2014-10-09 13:42:47

+0

嗯..也许是任何()的实际调用,而不是我所说的Lambda。 – herskinduk 2014-10-09 14:39:27

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)价格进行比较,它会。不管怎么说,还是要谢谢你! – 2014-10-09 15:32:55

+0

您的价格如何存储并与Sitecore内的产品相关联?您是否在电子商务模块中使用PriceMatrix字段,或者他们是否将与您关联的产品分开等等? – 2014-10-09 17:05:24