Qual è il modo migliore per costruire NSPredicate con a-molti rapporti profondi?
-
18-09-2019 - |
Domanda
Ho tre entità: EntityA, EntityB e EntityC connessi con le relazioni a-molti
.Si veda lo schema per i dettagli:
alt text http://img706.imageshack.us/img706/9974/screenshot20091220at124.png
Per ottenere tutte le istanze di EntityA che dipendono da EntityB.name Io uso il predicato in questo modo:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"];
Quello che dovrebbe essere predicato per ottenere tutte le istanze di EntityA che dipendono da EntityC.name?
Ho provato domanda come @"ANY EntityB.entitiesC.name like 'SomeName'"
ma ottengo un'eccezione "multiple to-many keys not allowed here"
.
Con i migliori saluti,
Victor
Soluzione
La mia soluzione finale è quella di utilizzare sottoquery.
NSPredicate *p = [NSpredicate predicateWithFormat:@"(name like %@) AND (0 != SUBQUERY(entitiesB, $x, (0 != SUBQUERY($x.entitiesC, $y, $y.name like %@).@count)).@count)", nameA, nameC];
Purtroppo non sono riuscito a ampliare questa ricerca oggetti nsExpression.
Altri suggerimenti
Mentre ero fermato al seguente decisione:
In primo luogo, ho tutto l'EntityC che soddisfano la condizione di EntityC.name uguale a 'SomeName'
NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName];
...
NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
Poi ho una serie di EntityB dall'alto di query
NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"];
che ottenere gamma di EntityB che soddisfano la condizione di EntityB.EntitiesC.name uguale a 'SomeName':
NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject];
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs];
NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];
Lo ripeto lo stesso per EntityA.
L'efficacia di questa soluzione in dubbio e mi aspetto una soluzione migliore per questo problema.