2

我有一个复杂的谓词我正在努力解决。

基本上,我有一个学生对象。学生有 testScoreObjects。TestScoreObject 具有诸如 scoreDate (NSDate) 和 score (NSNumber) 等属性。

我想要一个最近(按 scoreDate)TestScoreObject 的分数大于 n 的学生列表。

理想情况下,在 NSFetchedResultsController 上使用一个 NSPredicate 会很棒。

我知道如何通过查看所有学生以编程方式完成此任务,但我想知道这是否可以通过谓词来完成,这样我就可以保留拥有 FetchedResultsController 的所有美妙好处。

感谢您的任何帮助!

4

2 回答 2

1

我会使用以下谓词:

NSString *format = @"SUBQUERY(testScoreObjects, $each, $each.score > $n && $each.scoreDate == testScoreObjects.@max.scoreDate)[SIZE] > 0";
NSDictionary *substitutions = @{@"n": @3}; // 3 is the value for n
NSPredicate *predicate = [[NSPredicate predicateWithFormat:format] predicateWithSubstitutionVariables:substitutions];

或者

NSString *format = @"ANY SUBQUERY(testScoreObjects, $each, $each.score > $n).scoreDate == testScoreObjects.@max.scoreDate";
NSDictionary *substitutions = @{@"n": @3}; // 3 is the value for n
NSPredicate *predicate = [[NSPredicate predicateWithFormat:format] predicateWithSubstitutionVariables:substitutions];

两者都可以正常过滤数组,但我尚未测试 CoreData 是否能够将它们转换为 SQL(因此它可以与 fetch 请求一起使用)。

在处理大型商店时,第二个谓词应该更有效(据我所知),因为testScoreObjects.@max.scoreDate每个学生只评估一次。当然,实际结果可能会有所不同。

于 2012-12-20T01:07:06.950 回答
0

当涉及到对象图时,子查询实际上是 SQL 继承的拐杖。我认为你可以没有那个。看看事情有多简单:

[NSPredicate predicateWithFormat:
     @"ANY testScores.scoreDate > %@", cutoffDate];
于 2012-12-20T10:19:20.833 回答