У меня есть три объекта: 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
Мое последнее решение - использовать 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.
Пока я останавливался на следующем решении:
Во-первых, я получаю все EntityC.name, которые удовлетворяют условию 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.
Эффективность этого решения вызывает сомнения, и я все еще ожидаю лучшего решения этой проблемы.