2

解決しようとしている複雑な述語があります。

基本的に、Studentオブジェクトがあります。学生はtestScoreObjectsを持っています。TestScoreObjectには、scoreDate(NSDate)やscore(NSNumber)などのプロパティがあります。

最新の(scoreDateによる)TestScoreObjectのスコアがnより大きい学生のリストが欲しいのですが。

理想的には、これを達成するのは、NSFetchedResultsController上の1つの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に変換できるかどうかをテストしていません(したがって、フェッチ要求で使用できます)。

大規模な店舗を扱う場合、2番目の述語は(私が知る限り)学生ごとに1回だけ評価されるため、より効率的であるはずです。testScoreObjects.@max.scoreDateもちろん、実際の結果は異なる場合があります。

于 2012-12-20T01:07:06.950 に答える
0

サブクエリは、オブジェクト グラフに関して言えば、実際には SQL 継承の松葉杖です。それがなくてもできると思います。物事がいかに単純であるかを見てみましょう:

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