1

モデルでこれらのエンティティを定義しています。

[Sample]
- results (to many relation with [Result])

[Parameter]
- results (to many relation with [Result])
- compliant (number value)

[Result]
- parameter (relation with [Parameter])
- sample (relation with [Sample])

[Sample] オブジェクト "MySample" の場合、次のすべての [Parameter] オブジェクトを取得する必要があります。

[Result].compliant = 1 AND [Result].sample = MySample

したがって、これらの述語の合計になる述語を使用して [Parameter] オブジェクトをフェッチしようとしています。

// returns all parameters that have a result compliant value equal to 1:
ANY results.compliant = 1

// returns all parameters related with my [Sample] object:
ANY results.sample = MySample

両方の述語は期待どおりに機能しますが、[Sample] オブジェクトに接続されたすべてのパラメーターを取得する必要があるため、一緒に使用したいと思います。結果の準拠値は 1 です。

私はそのようなことを試しました:

ANY (results.compliant = 1 AND results.sample = MySample)

しかし、「無効な述語」の例外が発生します。

SUBQUERY も使用しようとしましたが、例外が発生します。

Can't have a non-relationship collection element in a subquery

そのクエリに注目したいと思います:

ANY results.compliant = 1 AND ANY results.sample = MySample

は有効なクエリですが、探しているものではありません。

[Result] オブジェクトが [Sample] オブジェクトに接続され、準拠値が 1 に等しいすべての [Parameter] オブジェクトを与える単一の述語でこの問題を解決するにはどうすればよいですか?

アップデート:

NSCompoundPredicate を使用しても期待どおりの結果が得られません。私はこのようなものが必要です:

ANY (results.compliant = 1 AND results.sample = MySample)

複合述語を使用すると、次のように機能します。

(ANY results.compliant = 1) AND (ANY results.sample = MySample)

複合述語は、適合値が 1 に等しい結果を持つパラメーターと、MySample に接続された結果を持つパラメーターを提供しますが、必要なのは、MySample に接続され、かつ適合値が 1 に等しい結果を持つパラメーターを取得することです (両方とも条件は、単一の [Result] オブジェクトに対して準拠する必要があります)。それを達成する方法はありますか?

更新 2:

間違ったSUBQUERYを使用していたようです。解決策は、使用する必要があるように使用することです:-) SUBQUERYを使用すると、適切な結果を得ることができます。

4

2 に答える 2

6

これは電話で入力しているため、構文エラーが発生する可能性がありますが、サブクエリが必要な場所は次のとおりです。

[NSPredicate predicateWithFormat:@"SUBQUERY(results, $r, $r.compliant = 1 AND $r.sample = %@).@count > 0", mySample]
于 2013-06-10T15:27:38.307 に答える
3

NSCompoundPredicate を使用することをお勧めします。

述語を作成して配列に追加し、そのように NSCompoundPredicate として割り当てます。

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
于 2013-06-10T15:00:25.583 に答える