[英]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.