2

Я работаю над Sitecore 8.1, и я реализую функцию фильтра для одной из страниц Sitecore lucene. Fot filtering Я использую построитель предикатов. У меня есть 3 мульти-листы поля на деталях элементовКак я могу использовать predicate buider для Sitecore Lucene Search

  1. Продукт
  2. Категория
  3. Услуги

Теперь на странице данных У меня есть все три группы фильтров, как флажками, как указано в изображении ниже - enter image description here

Мои требования Я хочу применить Или между внутри группы, как между условиями продукта должно быть Или и между двумя группами состояние должно быть И. Например, продукты и Категория должны быть И.

Я последовал http://getfishtank.ca/blog/building-dynamic-content-search-linq-queries-in-sitecore-7 блоге реализовать этот

Для достижения этой цели, что я пытаюсь -

var builder = PredicateBuilder.True<TestResultItem>(); 
var Categorybuilder = PredicateBuilder.False<TestResultItem>(); 
if (!string.IsNullOrEmpty(Categorys)) 
{ 
    var CategoryItems = Categorys.Split('|'); 
    foreach (var Category in CategoryItems) 
    { 
     var ct = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(Categorys, true); 
     Categorybuilder = Categorybuilder.Or(i => i.Category.Contains(ct)); 
    } 
} 

var Servicebuilder = PredicateBuilder.False<TestResultItem>(); 
if (!string.IsNullOrEmpty(Service)) 
{ 
    var ServiceItems = Service.Split('|'); 
    foreach (var ser in ServiceItems) 
    { 
     var si = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(ser, true); 
     Servicebuilder = Servicebuilder.Or(i => i.Service.Contains(si)); 
    } 
} 

var productsbuilder = PredicateBuilder.False<TestResultItem>(); 
if (!string.IsNullOrEmpty(products)) 
{ 
    var productItems = products.Split('|'); 
    foreach (var product in productItems) 
    { 
     var pd = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(product, true); 
     productsbuilder = productsbuilder.Or(i => i.Category.Contains(pd)); 
    } 
} 

Servicebuilder = Servicebuilder.Or(Categorybuilder); 
productsbuilder = productsbuilder.Or(Servicebuilder); 
builder = builder.And(productsbuilder); 

выше данный код не работает для меня. Я знаю, что делаю что-то не так, поскольку я плохо разбираюсь в Predicate builder, Или Условие не работает между группами checkbox.

Может кто-нибудь скажет мне, где я ошибаюсь в данном коде или наилучшим образом достичь этого.

Любая помощь будет оценена

ответ

2

я сделал что-то подобное в последнее время, и это работает так:

Создайте свой «или» предикаты:

var tagPredicate = PredicateBuilder.False<BlogItem>(); 
tagPredicate = tagValues.Aggregate(tagPredicate, (current, tag) => current.Or(p => p.Tags.Contains(tag))) 

где tagValues ​​является IEnumerable, содержащий нормализованные.

Я делаю это для нескольких руководящих списков. В конце концов, я обернуть их вместе, как это:

var predicate = PredicateBuilder.True<BlogItem>(); 
predicate = predicate.And(tagPredicate); 
predicate = predicate.And(...); 

Глядя на ваш код: в первую очередь изменения

Servicebuilder = Servicebuilder.Or(Categorybuilder); 
productsbuilder = productsbuilder.Or(Servicebuilder); 
builder = builder.And(productsbuilder); 

в

builder = builder.And(Categorybuilder); 
builder = builder.And(Servicebuilder); 
builder = builder.And(productsbuilder); 
+0

это работает bro ... его просто потрясающе ... вау ... ты отличный ... – Learner

+0

Спасибо @Gatogordo позвольте мне попробовать это –

+0

Эй спасибо за ваши материалы Я использовал некоторые из ваших подходов и сделал с моим старый код !! Еще раз спасибо :) –

1

Вы должны иметь один главный предикат присоединиться фильтры с условием И & другие предикаты (например, для категорий или услуг или продуктов) для объединения фильтров внутри с условием ИЛИ.

// This is your main predicate builder 
var builder = PredicateBuilder.True<TestResultItem>(); 
var Categorybuilder = PredicateBuilder.False<TestResultItem>(); 
var Servicebuilder = PredicateBuilder.False<TestResultItem>(); 
var productsbuilder = PredicateBuilder.False<TestResultItem>(); 
builder = builder.And(Categorybuilder); 
builder = builder.And(Servicebuilder); 
builder = builder.And(productsbuilder); 

Надеется, что это поможет.

+0

Спасибо @Vikram, я сделал некоторые небольшие изменения в моем старом кодексе, например, добавив новый конструктор внутри оператора if, и он работает для меня, но один на голосование за ваш быстрый hel \ p :) –

0

Спасибо всем за предоставление вашего вклада -

Я обновил код в соответствии с вашими входами и теперь он работает. Было два изменения в моем старом коде, который был строителем для мультилиста, должен быть внутри оператора if, а также добавлять вновь созданный строитель к основному строителю в том же месте (внутри оператора if) -

Я делюсь следующим кодом что если кто-то хочет использовать его, он может легко скопировать отсюда -

var builder = PredicateBuilder.True<TestResultItem>(); 
if (!string.IsNullOrEmpty(Categorys)) 
{ var Categorybuilder = PredicateBuilder.False<TestResultItem>(); 
    var CategoryItems = Categorys.Split('|'); 
    foreach (var Category in CategoryItems) 
    { 
     var ct = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(Categorys, true); 
     Categorybuilder = Categorybuilder.Or(i => i.Category.Contains(ct)); 
    } 
    builder = builder.And(Categorybuilder); 
} 


if (!string.IsNullOrEmpty(Service)) 
{ 
    var Servicebuilder = PredicateBuilder.False<TestResultItem>(); 
    var ServiceItems = Service.Split('|'); 
    foreach (var ser in ServiceItems) 
    { 
     var si = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(ser, true); 
     Servicebuilder = Servicebuilder.Or(i => i.Service.Contains(si)); 
    } 
    builder = builder.And(Servicebuilder); 
} 


if (!string.IsNullOrEmpty(products)) 
{ 
    var productsbuilder = PredicateBuilder.False<TestResultItem>(); 
    var productItems = products.Split('|'); 
    foreach (var product in productItems) 
    { 
     var pd = Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(product, true); 
     productsbuilder = productsbuilder.Or(i => i.Category.Contains(pd)); 
    } 
    builder = builder.And(productsbuilder); 
} 

в приведенном выше коде Categorys, Услуги и продукты трубы, разделенные ценности, которые приходят из Sitecore Multi-поле списка.

Еще раз спасибо за помощь!

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

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