iphone - que - ¿Cuál es la mejor manera de construir NSPredicate con muchas relaciones profundas?
proceso de fabricacion del iphone 7 (2)
Tengo tres entidades: EntityA, EntityB y EntityC conectadas con muchas relaciones.
Ver esquema para más detalles:
texto alternativo http://img706.imageshack.us/img706/9974/screenshot20091220at124.png
Para obtener todas las instancias de EntityA que dependen de EntityB.name, uso el predicado de esta manera:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like ''SomeName''"];
¿Cuál debería ser el predicado para obtener todas las instancias de EntityA que dependen de EntityC.name? @"ANY EntityB.entitiesC.name like ''SomeName''"
consulta como @"ANY EntityB.entitiesC.name like ''SomeName''"
pero obtienes la excepción "multiple to-many keys not allowed here"
.
Atentamente,
Víctor
Mi solución final es usar SUBQUERY.
NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@).@count)).@count)", nameA, nameC];
Lamentablemente, no pude expandir esta consulta sobre los objetos nsExpression.
Mientras estaba detenido en la siguiente decisión:
Primero, obtengo todos los EntityC que satisfacen la condición EntityC.name igual a ''SomeName''
NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName];
...
NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
Luego obtengo una matriz de EntityB de la consulta anterior
NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"];
Que obtener una matriz de EntityB que satisfaga la condición EntityB.EntitiesC.name igual a ''SomeName'':
NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject];
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs];
NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];
Repito lo mismo para EntityA.
La efectividad de esta solución es dudosa y aún espero una mejor solución para este problema.