我需要根据用户选择的过滤条件在我的应用中构建一些相当复杂的谓词。然后使用构造的谓词从应用程序的核心数据数据库中获取数据。
过滤谓词的一部分涉及一个子查询表达式,其中包含一些更多变化和复杂的谓词,用于构造子查询的谓词。我想优化我的代码并避免每次创建过滤谓词时解析字符串。所以我一直在使用谓词模板和predicateWithSubstitutionVariables:
以及NSCompoundPredicate
来构造各种过滤谓词组件的谓词。
我的问题是如何用谓词模板和子查询谓词构造最终谓词。
我尝试为子查询本身使用谓词模板,但它无法解析格式字符串:
[NSPredicate predicateWithFormat:@"SUBQUERY(routes, $route, $ROUTE_PREDICATE).@count > 0"];
在这个实例中, $ROUTE_PREDICATE
是我从其他谓词模板构建的复杂谓词,这些模板本身使用$route
来评估路由属性中的表达式。
然后我尝试使用子查询谓词构造谓词作为格式化方法中的参数,并且它再次无法解析格式字符串:
[NSPredicate predicateWithFormat:@"SUBQUERY(routes, $route, %@).@count > 0", routePredicate];
routePredicate
也是从其他谓词模板构造的复杂谓词。
现在我正在使用expressionForSubquery:usingIteratorVariable:predicate:
NSExpression
方法构建谓词。这就是我到目前为止所做的:
[NSExpression expressionForSubquery:[NSExpression expressionForKeyPath:@"routes"] usingIteratorVariable:@"route" predicate:routePredicate];
哪个应该给我子查询表达式部分。然后我有一个NSComparisonPredicate
来比较> 0
[NSComparisonPredicate predicateWithLeftExpression:expression rightExpression:[NSExpression expressionForConstantValue:@0] modifier:NSDirectPredicateModifier type:NSGreaterThanPredicateOperatorType options:0];
我坚持如何使用.count
评估子查询表达式来创建最终expression
的{{1}}变量部分。我认为它将涉及另一个表达式NSComparisonPredicate
,但我不确定如何使用子查询表达式来评估它。
这就是如果这甚至可以让我到达我想要的地方,从谓词模板和替换变量构造的子查询谓词构造最终谓词。我是在正确的轨道上吗?有没有更好的方法来解决这个问题?
修改 我试过这个:
[NSExpression expressionForKeyPath:@"count"]
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionWithFormat:@"%@.@count", expression] rightExpression:[NSExpression expressionForConstantValue:@0] modifier:NSDirectPredicateModifier type:NSGreaterThanPredicateOperatorType options:0];
是上面的子查询表达式。代码运行方式如下。现在看看它是否也符合我的要求......
编辑2:
查询在该实现中按预期运行。唯一不必要的字符串解析是expression
。因此,如果有人知道如何在没有格式字符串方法的情况下执行此操作,请告知我们。