3

У меня возникла проблема с запросом вычисленного поля индекса IEnumerable. Я использую Sitecore 7.2 upd2, Lucene, ContentSearch и PredicateBuilder.Sitecore Content Search PredicateBuilder vs 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().

Поиск контента в LINK имеет некоторые ограничения. Одним из них является то, что методы принимают только «постоянные выражения» (объекты) в качестве параметров. Вы передаете выражение «lamda» в качестве параметра для метода Any.

+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. В этом случае поиск не должен возвращать этот раздел. Но это будет, если я буду использовать только max (300) и min (100) для сравнения. Спасибо, в любом случае! –

+0

Как ваши цены хранятся и связаны с продуктами в Sitecore? Используете ли вы поле PriceMatrix с модулем электронной коммерции или являетесь ли они отдельными элементами, которые вы связываете с продуктами и т. Д.? –

 Смежные вопросы

  • Нет связанных вопросов^_^