Подтвердить что ты не робот

Какой лучший способ построить NSPredicate со многими глубокими отношениями?

У меня есть три объекта: EntityA, EntityB и EntityC, связанные со многими отношениями.

Подробнее см. схему:

alt text http://img706.imageshack.us/img706/9974/screenshot20091220at124.png

Для получения всего экземпляра EntityA, который зависит от EntityB.name, я использую предикат следующим образом:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"];

Что должно быть предикатом для получения всего экземпляра EntityA, который зависит от EntityC.name? Я попробовал запрос типа @"ANY EntityB.entitiesC.name like 'SomeName'", но получаю исключение "multiple to-many keys not allowed here".

С уважением,

Виктор

4b9b3361

Ответ 1

Моим окончательным решением является использование SUBQUERY.

NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@)[email protected]))[email protected])", nameA, nameC];

К сожалению, я не смог расширить этот запрос на объектах nsExpression.

Ответ 2

Пока я был остановлен при следующем решении:

Сначала я получаю все EntityC, которые удовлетворяют условию EntityC.name, равному "SomeName"

NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName];

...

NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

Затем я получаю массив EntityB из запроса

NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"];

Затем получите массив EntityB, который удовлетворяет условию EntityB.EntitiesC.name, равному "SomeName":

NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject];
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs];

NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];

Я повторяю то же самое для EntityA.

Эффективность этого решения вызывает сомнения, и я все еще ожидаю лучшего решения этой проблемы.