21

我有三个实体:EntityA、EntityB 和 EntityC,它们与多对多关系相连。

有关详细信息,请参见架构:

替代文字 http://img706.imageshack.us/img706/9974/screenshot20091220at124.png

为了获取依赖于 EntityB.name 的 EntityA 的所有实例,我使用如下谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY EntityB.name like 'SomeName'"];

获取依赖于 EntityC.name 的所有 EntityA 实例的谓词应该是什么?我试过查询,@"ANY EntityB.entitiesC.name like 'SomeName'"但得到异常"multiple to-many keys not allowed here"

最好的祝福,

胜利者

4

2 回答 2

12

我的最终解决方案是使用 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 对象上展开此查询。

于 2010-04-22T14:29:02.400 回答
2

当我被以下决定阻止时:

首先,我得到所有满足条件 EntityC.name 等于 'SomeName' 的 EntityC

NSPredicate *p = [NSPredicate predicateWithFormat:@"name like %@", @"SomeName];

...

NSArray *res = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

然后我从上面的查询中得到一个 EntityB 数组

NSArray *parentBs = [res valueForKeyPath:@"@distinctUnionOfObjects.parent"];

比获取满足条件 EntityB.EntitiesC.name 等于 'SomeName' 的 EntityB 数组:

NSExpression *leftExpression = [NSExpression expressionForEvaluatedObject];
NSExpression *rightExpression = [NSExpression expressionForConstantValue:parentBs];

NSPredicate *p = [NSComparisonPredicate predicateWithLeftExpression:leftExpression rightExpression: rightExpression modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0];

我对 EntityA 重复相同的操作。

这个解决方案的有效性值得怀疑,我仍然期待这个问题有更好的解决方案。

于 2010-01-07T22:25:24.057 回答