Я использую PredicateBuilder для создания запроса к списку узлов Umbraco для фильтрации результатов поиска. У меня есть искомое значение идентификатора, поступающее в виде строки через QueryString, которую я затем сравниваю со строковым полем на каждом из узлов 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
user2998091 23 Июл 2017 в 22:15

1 ответ

Лучший ответ

Для вложения или в и, вы можете:

Сначала создайте или, затем и или:

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

4
Alan Tsai 24 Июл 2017 в 04:40
В этом есть большой смысл, и это работает! Спасибо за совет
 – 
user2998091
24 Июл 2017 в 06:39