PredicateBuilder:OR条件嵌套在.And()

时间:2017-07-23 19:15:52

标签: c# .net string umbraco predicatebuilder

我正在使用PredicateBuilder构建针对Umbraco节点列表的查询来过滤搜索结果。我通过QueryString将搜索到的ID值作为String传递,然后我将其与列表中每个Umbraco节点上的字符串字段进行比较以获得匹配。

目前,代码与目标字段匹配,查询字符串中有一个值可以正常工作。我需要在我的.And()中添加一个条件,它尝试将QS与字段String匹配,如果该字段有值,但如果该字段没有值,那么它也应该匹配。

    if (!string.IsNullOrEmpty(qsId))
    {
       predicate = predicate.And(i => 
       Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" + 
       qsId + "\\b"));
    }

我尝试了以下操作,但似乎无法正常工作:

    if (!string.IsNullOrEmpty(qsId))
    {
       predicate = predicate.And(i => 
       Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" + 
       qsId + "\\b") || 
       string.IsNullOrEmpty(i.GetProperty("makeTag")).Value.ToString());
    }

关于我做错了什么的想法,或者更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

用于嵌套或在和中,您可以:

创建或首先,然后创建或:

if (!string.IsNullOrEmpty(qsId))
{
    // default false
        var inner = PredicateBuilder.False<Product>();

    // first or
    inner = inner.Or (i => 
           Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" + 
           qsId + "\\b");

    // second or       
    inner = inner.Or (i => 
        string.IsNullOrEmpty(i.GetProperty("makeTag")).Value.ToString());


    predicate = predicate.And(inner);
}       

下面是我的原始答案,没有重新需要嵌套或在和

原始答案

如果我理解正确,你正试图实现(当硬编码时):

Where(i => 
   Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" + 
   qsId + "\\b" ||  string.IsNullOrEmpty(i.GetProperty("makeTag")).Value.ToString())

如果是这样,那么使用谓词构建器,它应该像:

if (!string.IsNullOrEmpty(qsId))
{

    // default false
    var predicate = PredicateBuilder.False<Product>();

    // first or
    predicate = predicate.Or (i => 
           Regex.IsMatch(i.GetProperty("makeTag").Value.ToString(), "\\b" + 
           qsId + "\\b");

    // second or       
    predicate = predicate.Or (i => 
        string.IsNullOrEmpty(i.GetProperty("makeTag")).Value.ToString());
}

谓词构建器的更多示例,请查看:http://www.albahari.com/nutshell/predicatebuilder.aspx