2016-02-29 4 views
1

У меня есть объект IQueryable<T> в качестве результатов поиска объект. Я применяю фильтрацию и сортировку по этому объекту поиска.Заказ Результаты поиска Sitecore

Прежде чем позвонить по телефону GetResults(), я хочу, чтобы заказать результаты, основываясь на этом значении (Fieldname - Priority). Поэтому для всех элементов в объекте IQueryable<T> я хочу заказать их по полю Priority, поэтому все элементы, которые имеют значение для этого поля, остаются в верхней части, а остальные находятся внизу.

У меня есть запись fieldmap для поля Priority.

search.OrderByDescending(i => !string.IsNullOrEmpty(i.GetItem().GetFieldValue("Priority"))) 

Вышеуказанная команда не работает. По-видимому, я не могу использовать методы расширения Sitecore с помощью IQueryable?

Если я конвертирую search.ToList(). Сделайте заказ, а затем преобразовать его обратно в AsQueryable(), я получаю следующее сообщение об ошибке:

There is no method 'GetResults' on type 'Sitecore.ContentSearch.Linq.QueryableExtensions' 
that matches the specified arguments 

Есть ли аккуратный и быстрый способ обойти это?

Приветствия

+0

'Я применяю фильтрацию и сортировку по этому объекту поиска' - Вы сортируете по нескольким полям? например Название и приоритет? – jammykam

+0

@jammykam - вроде да. Сначала я сортирую их по критериям, выбранным пользователем - например, Name, Date created и т. Д. После того, как я верну результаты, мне нужно заказать их по полю приоритета. – NomadTraveler

+0

Вы подкачки результатов или можете заказать после получения результатов? –

ответ

0

Я думаю, вам просто нужно добавить поле к вашему SearchResultItem и пометить его как междунар. Я делаю предположение, что поле является int. Создайте собственный класс, который наследует SearchResultItem.

public class CustomSearchResultItem : SearchResultItem 
{ 
    [IndexField("Priority")] 
    public int Priority { get; set; } 
} 

Тогда используйте его в своем поиске. Наконец закажите его.

using (var context = ContentSearchManager.GetIndex("sitecore_master_index").CreateSearchContext()) 
{ 
    var results = context.GetQueryable<CustomSearchResultItem>().Where(prod => prod.Content.Contains("search box text").OrderByDescending(t => t.Priority); 
} 

Некоторые данные найдены здесь.

http://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/10/sorting-and-ordering-results.aspx

0

Вы можете заказать результаты поиска с использованием нескольких полей с помощью OrderByDescending в сочетании с ThenByDescending. Поэтому вам нужно будет заказать по приоритету, а затем по [Name | Date | Whatever].

I want to order them desc by Priority field, so all the items which has a value for that field stay at the top and the rest are at the bottom.

I sort them first on the criteria chosen by the user - like Name, Date created etc. Once I get the results back, I need to order them by priority field

Вы сталкиваетесь с вопросами и замечаниями. Если вы хотите, чтобы результаты с приоритетом первыми, а затем выбирается пользователем результатов, то следующий будет работать:

query = dataQuery.OrderByDescending(i => i.Title).ThenByDescending(i => i["Priority"]); 
var results = query.GetResults().Hits.Select(h => h.Document); 

Существовала ошибка в предыдущей версии Sitecore, что означало, что положение ThenBy будет добавлено до пункта OrderBy следовательно он добавляется в обратном порядке выше. Вы можете проверить, исправлено ли это в текущей версии. Если это так просто изменить свой запрос на:

query = dataQuery.OrderByDescending(i => i["Priority"]).ThenByDescending(i => i.Title); 

Вам не нужно добавить поле к вашему SearchResultItem, если вы просто хотите приказать это, только если вам необходимо фактическое значение этого поля возвращается в а ,

Если вам нужно сделать заказ, выполнив заказное пользователем значение, вы можете перейти в i => i["whatever-field-the-user-has-selected"] вместо i.Title.

Дополнительную информацию можно найти в this blog post.

+0

Извините, если мой вопрос казался запутанным. Я буду повторять. Сначала я сортирую их на основе выбранных пользователем критериев, а затем заказываю их в поле приоритета. Я не могу использовать поле Приоритет для заказа. Ошибка, которую я получаю, заключается в том, что 'Заказ может быть выполнен только в 'Sitecore.ContentSearch.Linq.Nodes.FieldNode'.' – NomadTraveler

+0

. Вы обновили конфигурацию поиска, чтобы также индексировать поле Priority? – jammykam

+0

Поле отображается. – NomadTraveler

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