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