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