Type Method 型メソッド

expressionForSubquery:usingIteratorVariable:predicate:

Creates an expression that filters a collection by storing elements in the collection in a specified variable and keeping the elements that the qualifier returns as true. ある式を作成します、それはコレクションをフィルタします、ある指定された変数の中のコレクションの中の要素をソートすること、そして限定子がtrueを返す要素を残すことによって。

Declaration 宣言

+ (NSExpression *)expressionForSubquery:(NSExpression *)expression 
                  usingIteratorVariable:(NSString *)variable 
                              predicate:(NSPredicate *)predicate;

Parameters パラメータ

expression

A predicate expression that evaluates to a collection. あるコレクションに評価する述部式。

variable

Used as a local variable, and will shadow any instances of variable in the bindings dictionary. The variable is removed or the old value replaced once evaluation completes. ローカル変数として使われます、そして束縛されている辞書の中の変数のあらゆるインスタンスを陰にします。変数は、除去されます、または一旦評価が完了すると古い値が置き換えられます。

predicate

The predicate used to determine whether the element belongs in the result collection. 要素が結果のコレクションに属するかどうか決定するために使われる述部。

Return Value 戻り値

An expression that filters a collection by storing elements in the collection in the variable variable and keeping the elements for which qualifier returns true ある式、それはコレクションをフィルタすることを、variable変数の中のコレクションの中の要素をソートすること、そしてそれに対して限定子がtrueを返すところの要素を保有することによって行います。

Discussion 議論

This method creates a sub-expression, evaluation of which returns a subset of a collection of objects. It allows you to create sophisticated queries across relationships, such as a search for multiple correlated values on the destination object of a relationship. このメソッドは下位式を作成します、それの評価はオブジェクトのコレクションのサブセットを返します。それは、あなたに洗練されたクエリをリレーションシップを越えて作成させます、例えばあるリレーションシップの行き先オブジェクト上での複数の相互に関連した値に対する検索など。

For example, suppose you have an Apartment entity that has a to-many relationship to a Resident entity, and that you want to create a query for all apartments inhabited by a resident whose first name is "Jane" and whose last name is "Doe". Using only API available for OS X v 10.4, you could try the predicate: 例えば、あなたがあるApartment登録項目を持つと仮定してください、それはResident登録項目に対する対多関係を持ちます、そしてそれはそのファーストネームが "Jane" でそのラストネームが "Doe" である居住者が住むすべてのアパートメントに対してクエリを作成することをあなたが望むものです。OS X v 10.4に利用可能なAPIだけを使って、あなたはこの述部を試みることが可能でした:


resident.firstname == "Jane" && resident.lastname == "Doe"

but this will always return false since resident.firstname and resident.lastname both return collections. You could also try: しかしこれは常にfalseを返します、resident.firstnameresident.lastnameの両方ともコレクションを返すことから。あなたはこうもできました:


resident.firstname CONTAINS "Jane" && resident.lastname CONTAINS "Doe"

but this is also flawed—it returns true if there are two residents, one of whom is John Doe and one of whom is Jane Smith. The only way to find the desired apartments is to do two passes: one through residents to find "Jane Doe", and one through apartments to find the ones where our Jane Does reside. しかしこれも欠点があります — それは2人の居住者、その1人が John Doe でその1人が Jane Smithがいるならばtrueを返します。望み通りのアパートメントを見つけるただ1つの道はこの2つを通ります:1つは "Jane Doe" を見つけるために居住者を端から端まで、そして1つは、そこにおいて私たちの Jane Does が住むところのものを見つけるためにアパートメントを端から端まで。

Subquery expressions provide a way to encapsulate this type of qualification into a single query. サブクエリ式は、この種の必要条件を単一のクエリへとカプセル化する方法を提供します。

The string format for a subquery expression is: サブクエリ式に対する文字列書式設定は次になります:


SUBQUERY(collection_expression, variable_expression, predicate);

where expression is a predicate expression that evaluates to a collection, variableExpression is an expression which will be used to contain each individual element of collection, and predicate is the predicate used to determine whether the element belongs in the result collection. ここでexpressionはコレクションに評価する述部式です、variableExpressioncollectionの個々の要素を含むために使われる式です、そしてpredicateはその要素が結果コレクションに含まれるかどうか決定するために使われる述部です。

Using subqueries, the apartment query could be reformulated as サブクエリを使って、アパートメントクエリが次のように再公式化されることができました


(SUBQUERY(residents, $x, $x.firstname == "Jane" && $x.lastname == "Doe").@count != 0)

or または


(SUBQUERY(residents, $x, $x.firstname == "Jane" && $x.lastname == "Doe")[size] != 0)