Я использую 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 ответ
Для вложения или в и, вы можете:
Сначала создайте или, затем и или:
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
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.