Какой лучший способ построить NSPredicate со многими глубокими отношениями? - PullRequest
21 голосов
/ 05 января 2010

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

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

альтернативный текст 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".

С уважением,

Victor

Ответы [ 2 ]

12 голосов
/ 22 апреля 2010

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

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

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

2 голосов
/ 08 января 2010

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

Сначала я получаю все 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.

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

...