Какой лучший способ построить 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"
.
С уважением,
Виктор
Ответы
Ответ 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.
Эффективность этого решения вызывает сомнения, и я все еще ожидаю лучшего решения этой проблемы.