С чем лучший путь состоит в том, чтобы создать NSPredicate к - много глубоких отношений?

У меня есть три объекта: 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

21
задан TechZen 16 August 2010 в 14:06
поделиться

2 ответа

Мое последнее решение - использовать 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.

12
ответ дан 29 November 2019 в 22:05
поделиться

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

Во-первых, я получаю все 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.

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

2
ответ дан 29 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: