2

私はSitecore 8.1を開発しており、Sitecore luceneによるページのフィルタ機能を実装しています。 Fot filtering私は述語ビルダーを使用しています。私は、リストページに今すぐ詳細項目の3のマルチリストフィールドSitecore Luceneで述語ブイダーを使用する方法Search

  1. 製品
  2. カテゴリー
  3. サービス

を持って下の画像に与えられたとして、私は、チェックボックスのようにすべての3つのグループフィルタを持っている - enter image description here

私の要件は、またはのようなグループの中に適用したいですか?製品条件の間にまたはであり、2つのグループ間の条件はである必要があります。たとえば、商品とカテゴリはです。

私がしようとしています何これを達成するために、この

を実装するために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); 

を上記のコードは私のために働いていません。条件付きビルダーでまたはの条件が機能していないため、私が間違ったことをしていることがわかります。

誰でも私が指定したコードまたはこれを達成するための最良の方法で間違っている場所を教えてください。

すべてのヘルプは

答えて

2

をいただければ幸い私は最近、似た何かをしたし、それがこのように動作します:tagValuesが含むIEnumerableをされ

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

は、あなたの "または" 述語を作成します。正規化されたguid

私はいくつかのGUIDリストでこれを行います。あなたのコードを見てみると

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

:すべての変更の最初の

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

それはちょうど素晴らしい...うわー...あなたは素晴らしいです... – Learner

+0

@Gatogordoは私にこれを試してみましょう –

+0

あなたの入力のためにちょっと感謝私はあなたのアプローチのいくつかを使用してやった古いコード!もう一度ありがとう:) –

1

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

あなたが参加する一つのメイン述語を持っている必要があります最後に、私はこのようにそれらを一緒に包みますAND条件を持つフィルタ& 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、私はif文の中に新しいビルダーを置くような私の古いコードでいくつかの小さな変更を加え、それは私のために働くが、あなたの迅速なhel \ p :) –

0

おかげ -

私はあなたの入力ごとに、コードを更新し、今では働いています。 私の古いコードに2つの変更がありました.1つは、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では、サービスや製品はサイトコア、マルチリストフィールドから来ているパイプ区切りの値です。

もう一度お返事ありがとうございます。

関連する問題