Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用谓词构建器进行Sitecore Lucene搜索_Sitecore_Lucene.net_Sitecore8_Predicatebuilder_Sitecore Lucene - Fatal编程技术网

如何使用谓词构建器进行Sitecore Lucene搜索

如何使用谓词构建器进行Sitecore Lucene搜索,sitecore,lucene.net,sitecore8,predicatebuilder,sitecore-lucene,Sitecore,Lucene.net,Sitecore8,Predicatebuilder,Sitecore Lucene,我正在开发Sitecore 8.1,我正在为Sitecore lucene的一个页面实现过滤功能。我正在使用谓词生成器进行Fot筛选。我有3个详细项目的多列表字段 产品 类别 服务 现在在列表页面上,我将所有三个组过滤器作为复选框,如下图所示- 我的要求是我想在组内应用或,就像产品之间的条件应该是或,两组之间的条件应该是和。例如,产品和类别应为和 我跟随博客帖子实现了这一点 为了实现这一目标,我正在努力- var builder=PredicateBuilder.True(); var Cat

我正在开发Sitecore 8.1,我正在为Sitecore lucene的一个页面实现过滤功能。我正在使用谓词生成器进行Fot筛选。我有3个详细项目的多列表字段

  • 产品
  • 类别
  • 服务
  • 现在在列表页面上,我将所有三个组过滤器作为复选框,如下图所示-

    我的要求是我想在组内应用,就像产品之间的条件应该是,两组之间的条件应该是。例如,产品和类别应为

    我跟随博客帖子实现了这一点

    为了实现这一目标,我正在努力-

    var builder=PredicateBuilder.True();
    var Categorybuilder=PredicateBuilder.False();
    如果(!string.IsNullOrEmpty(类别))
    {
    var CategoryItems=类别拆分(“|”);
    foreach(分类项目中的var类别)
    {
    var ct=Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(Categorys,true);
    Categorybuilder=Categorybuilder.Or(i=>i.Category.Contains(ct));
    }
    }
    var Servicebuilder=PredicateBuilder.False();
    如果(!string.IsNullOrEmpty(服务))
    {
    var ServiceItems=Service.Split(“|”);
    foreach(ServiceItems中的var ser)
    {
    var si=Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(ser,true);
    Servicebuilder=Servicebuilder.Or(i=>i.Service.Contains(si));
    }
    }
    var productsbuilder=PredicateBuilder.False();
    如果(!string.IsNullOrEmpty(产品))
    {
    var productItems=products.Split(“|”);
    foreach(productItems中的var产品)
    {
    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);
    
    上面给出的代码不适用于我。我知道我做错了什么,因为我不擅长谓词生成器,条件在复选框组之间不起作用

    有谁能告诉我在给定的代码中我错在哪里,或者是实现这一点的最佳方法


    任何帮助都将不胜感激

    我最近做了类似的事情,效果如下:

    创建“或”谓词:

    var tagPredicate=PredicateBuilder.False();
    tagPredicate=tagValues.Aggregate(tagPredicate,(current,tag)=>current.Or(p=>p.Tags.Contains(tag)))
    
    其中tagValues是一个包含规范化GUID的IEnumerable

    我对几个guid列表执行此操作。最后,我将它们像这样包装在一起:

    var predicate=PredicateBuilder.True();
    谓词=谓词和(tagPredicate);
    谓词=谓词和(…);
    
    查看您的代码:首先是更改

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

    builder=builder.And(Categorybuilder);
    builder=builder.和(Servicebuilder);
    builder=builder.And(productsbuilder);
    
    您需要有一个主谓词来连接过滤器和条件,以及其他谓词(例如类别、服务或产品)来连接过滤器和条件

    //这是您的主谓词生成器
    var builder=PredicateBuilder.True();
    var Categorybuilder=PredicateBuilder.False();
    var Servicebuilder=PredicateBuilder.False();
    var productsbuilder=PredicateBuilder.False();
    builder=builder.And(Categorybuilder);
    builder=builder.和(Servicebuilder);
    builder=builder.And(productsbuilder);
    

    希望这能对您有所帮助。

    谢谢大家提供的意见-

    我根据您的输入更新了代码,现在它开始工作了。 在我的旧代码中有两个更改:一个是multilist的构建器应该在if语句中,另一个是将新创建的构建器添加到同一位置的主构建器中(在if语句中)——

    我正在分享下面的代码,这样如果有人想使用它,他可以很容易地从这里复制-

    var builder=PredicateBuilder.True();
    如果(!string.IsNullOrEmpty(类别))
    {var Categorybuilder=predictebuilder.False();
    var CategoryItems=类别拆分(“|”);
    foreach(分类项目中的var类别)
    {
    var ct=Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(Categorys,true);
    Categorybuilder=Categorybuilder.Or(i=>i.Category.Contains(ct));
    }
    builder=builder.And(Categorybuilder);
    }
    如果(!string.IsNullOrEmpty(服务))
    {
    var Servicebuilder=PredicateBuilder.False();
    var ServiceItems=Service.Split(“|”);
    foreach(ServiceItems中的var ser)
    {
    var si=Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(ser,true);
    Servicebuilder=Servicebuilder.Or(i=>i.Service.Contains(si));
    }
    builder=builder.和(Servicebuilder);
    }
    如果(!string.IsNullOrEmpty(产品))
    {
    var productsbuilder=PredicateBuilder.False();
    var productItems=products.Split(“|”);
    foreach(productItems中的var产品)
    {
    var pd=Sitecore.ContentSearch.Utilities.IdHelper.NormalizeGuid(product,true);
    productsbuilder=productsbuilder.Or(i=>i.Category.Contains(pd));
    }
    builder=builder.And(productsbuilder);
    }
    
    在上述代码类别中,服务和产品是管道分隔的值,它们来自Sitecore多列表字段


    再次感谢大家的帮助

    谢谢@Gatogordo让我试试看嘿谢谢你的投入我确实使用了你的一些方法并使用了我的旧代码!!再次感谢:)感谢@Vikram,我在我的旧代码中做了一些小改动,比如在if语句中添加了新的生成器,它对我很有效,但对您的快速帮助投了一票:)