2

我正在使用Sitecore 8.1,並且正在爲Sitecore lucene的頁面之一實現過濾器功能。過濾我正在使用謂詞構建器。我有房源頁面上的明細項目3多列表場如何使用Sitecore Lucene的謂詞buider搜索

  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,條件不適用於複選框組之間。

任何人都可以告訴我在給定的代碼或任何最佳的方式來實現這一點我錯了。

任何幫助,將不勝感激

回答

2

我做了類似的事情最近,它的工作原理是這樣的:

創建 「或」 謂詞:

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

其中tagValues是包含一個IEnumerable規範化的指導。

我這樣做幾個guid列表。最後我一起包起來是這樣的:

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

它的工作兄弟...它只是真棒...哇...你是偉大的... – Learner

+0

感謝@Gatogordo讓我試試這個 –

+0

嘿謝謝你的輸入我確實使用了一些你的方法,並用我的舊代碼!再次感謝:) –

1

你需要有一個主謂加盟用條件&過濾其他謂詞(例如用於類別或服務或產品)以在OR條件下內部連接過濾器。

// 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,我在舊代碼中做了一些小改動,比如把新的構建器放在裏面,如果聲明和它適用於我,但是對於你的快速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的多表欄來管分隔值。

再次感謝大家的幫助!