繁体   English   中英

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

[英]PredicateBuilder: OR condition nested inside .And()

我正在使用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());
    }

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

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

创建或首先,然后和或:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM