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

use*_*091 3 .net c# string umbraco predicatebuilder

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

目前,代码对目标字段进行匹配,因为查询字符串中有一个值,效果很好。我需要在 .And() 中添加一个条件,如果该字段有值,则尝试将 QS 与字段字符串进行匹配,但如果该字段没有值,那么它也应该匹配。

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

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

    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());
    }
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*sai 5

对于嵌套或 in and,您可以:

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

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);
}       
Run Code Online (Sandbox Code Playgroud)

下面是我原来的答案,没有意识到需要嵌套或在和


原答案

如果我理解正确,您正在尝试实现(在硬编码时):

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

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

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());
}
Run Code Online (Sandbox Code Playgroud)

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