编写NSPredicate可以跨多个关系过滤结果

时间:2013-07-24 09:35:25

标签: objective-c core-data nspredicate

以下是关系图。我有一组我已检索的食谱和一组BaseIngredients。我想要返回一组包含所有这些成分的食谱。我当前的谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND ingredientSections.ingredients.baseIngredient IN %@", recipes, self.ingredientsFilter];

悲惨地失败了。这样做的正确方法是什么?

Object Graph

1 个答案:

答案 0 :(得分:1)

使用嵌套的to-many关系,您可能需要一个SUBQUERY。

以下谓词将返回所有配方,其中任何成分部分的任何基本成分都在给定集合中:

[NSPredicate predicateWithFormat:@"SELF IN %@ AND SUBQUERY(ingredientSections, $s, ANY $s.ingredients.baseIngredient IN %@).@count > 0",
     recipes, self.ingredientsFilter];

但不幸的是,这并不是你所需要的。获得所有食谱 包含所有给定成分的部分,以下内容可能有效:

[NSPredicate predicateWithFormat:@"SELF IN %@ AND SUBQUERY(ingredientSections, $s, SUBQUERY($s.ingredients, $i, $i.baseIngredient IN %@).@count == %d).@count > 0",
     recipes, self.ingredientsFilter, [self.ingredientsFilter count]];