PredicateBuilder:OR 条件嵌套在 .And() 中
PredicateBuilder: OR condition nested inside .And()
我正在使用 PredicateBuilder 构建针对 Umbraco 节点列表的查询以过滤搜索结果。我通过 QueryString 将搜索到的 ID 值作为字符串传递过来,然后我将其与列表中每个 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());
}
关于我做错了什么或者更好的方法来解决这个问题有什么想法吗?
对于嵌套或在 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);
}
下面是我原来的回答,没有重新定位需要嵌套或者在and
原回答
如果我对你的理解正确,你试图实现(硬编码时):
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
我正在使用 PredicateBuilder 构建针对 Umbraco 节点列表的查询以过滤搜索结果。我通过 QueryString 将搜索到的 ID 值作为字符串传递过来,然后我将其与列表中每个 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());
}
关于我做错了什么或者更好的方法来解决这个问题有什么想法吗?
对于嵌套或在 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);
}
下面是我原来的回答,没有重新定位需要嵌套或者在and
原回答
如果我对你的理解正确,你试图实现(硬编码时):
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