Поиск контента Sitecore PredicateBuilder против IEnumerable

У меня проблема с запросом поля вычисляемого индекса 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.

Есть идеи?


person Bartek KG    schedule 09.10.2014    source источник


Ответы (2)


Ошибка связана с параметром вызова метода Any().

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

person herskinduk    schedule 09.10.2014
comment
да, похоже, я тоже пробовал обычный .Count() - безуспешно. Итак, похоже, я не могу выполнять здесь какие-либо простые операции с IEnumerable. - person Bartek KG; 09.10.2014
comment
Хм... возможно, это фактический вызов Any(), а не Lambda, как я сказал. - person herskinduk; 09.10.2014

Я бы предложил индексировать как минимальную, так и максимальную цену для каждого продукта в виде отдельных вычисляемых полей (десятичных) в индексе.

Это значительно упростит ваш запрос:

var results = context.GetQueryable<ProductSearchResultItem>
    .Where(p => p.MinPrice >= myPrice)
    .Where(p => p.MaxPrice <= myPrice)
    .GetResults();
person Derek Hunziker    schedule 09.10.2014
comment
это был мой первоначальный план :) но он терпит неудачу, когда цены на товары в разделе {100 200 300}, а вы ищете цены между 225 и 250. В этом случае поиск не должен возвращать этот раздел. Но будет, если я буду использовать для сравнения только максимальную (300) и минимальную (100) цены. Спасибо, в любом случае! - person Bartek KG; 09.10.2014
comment
Как ваши цены хранятся и связаны с продуктами в Sitecore? Используете ли вы поле PriceMatrix с модулем электронной коммерции или это отдельные элементы, которые вы связываете с продуктами и т. д.? - person Derek Hunziker; 09.10.2014