NSPredicate 检测多个实体关系中存在的一整套实体
NSPredicate to detect an entire set of entities being present in multiple entity relationships
给定这样的核心数据实体设置
- 实体A
- aB -> B(多对一)
- aC -> C(多对一)
- children -> Child(多对多)
- 实体B
- children -> Child(多对多)
- 实体C
- children -> Child(多对多)
- 实体Child
我正在尝试执行查询以查找所有实体 A,这样一组 Child 个实体 TestChildren 在所有可达的 Children 中被发现。对于匹配的 A 实体,例如 A1
测试Child人集
- Child1
- Child2
- Child3
- Child4
A1实体
- aB -> B1
- aC -> C1
- child仁
- -> child1
- -> child3
- B1实体
- child仁
- -> child2
- C1实体
- child仁
- -> child4
所以在每个 class.
的各种 children 关系中找到了所有 4 children
似乎要测试这些集合,我必须对每个 Children 关系执行子查询,但我不认为我可以用 NSPredicate 格式表达我想要的东西..也许它不是NSPredicates 完全可行吗?
我的一个想法是做这样的事情
predicateString += "((SUBQUERY(aB.children, $child, $child in %@).@count + SUBQUERY(aC.children, $child, $child in %@).@count + SUBQUERY(children, $child, $child in $@).@count) == $@)"
predicateVars.append(contentsOf: [testChildren, testChildren, testChildren, testChildren.count])
所有 children 关系的匹配总数必须匹配..不幸的是,如果相同的 child 可能出现在多个 A、B 或 C 中,那么这不会是正确的,因为在两个不同的 class 中匹配的相同 child 会导致总数不正确地匹配。
不管怎样,在 NSPredicates 中加起来似乎是不可能的?
真正正确地做到这一点的唯一方法是能够在 3 classes 中生成所有 children 的总集,但同样似乎没有在 NSPredicate 中表达这个的方法?
更糟糕的情况我可以做一个更简单的查询并对返回的结果执行更多的逻辑,但理想情况下我会尝试在查询中做尽可能多的繁重工作。
提前致谢
谓词以查找所有带有 child 的 A:
NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
AND 谓词以查找所有具有 child1
和 child2
以及 child3
和 child4
的 A:
var predicateArray:[NSPredicate] = []
for child in testChildren {
let predicate = NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
predicateArray.append(predicate)
}
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:predicateArray)
上述 Willeke 回答的另一个版本是构建描述为带有变量的字符串的谓词,如此处所示
var predicateString:String = ""
var predicateVars:[Any] = []
for child in testChildren
{
if (predicateString.count > 0)
{
predicateString += " && "
}
predicateString += "(aB.children contains %@ || aC.children contains %@ || children contains %@)"
predicateVars.append(contentsOf: [child, child, child])
}
let predicate = NSPredicate(format: predicateString, argumentArray: predicateVars)
给定这样的核心数据实体设置
- 实体A
- aB -> B(多对一)
- aC -> C(多对一)
- children -> Child(多对多)
- 实体B
- children -> Child(多对多)
- 实体C
- children -> Child(多对多)
- 实体Child
我正在尝试执行查询以查找所有实体 A,这样一组 Child 个实体 TestChildren 在所有可达的 Children 中被发现。对于匹配的 A 实体,例如 A1
测试Child人集
- Child1
- Child2
- Child3
- Child4
A1实体
- aB -> B1
- aC -> C1
- child仁
- -> child1
- -> child3
- B1实体
- child仁
- -> child2
- child仁
- C1实体
- child仁
- -> child4
- child仁
所以在每个 class.
的各种 children 关系中找到了所有 4 children似乎要测试这些集合,我必须对每个 Children 关系执行子查询,但我不认为我可以用 NSPredicate 格式表达我想要的东西..也许它不是NSPredicates 完全可行吗?
我的一个想法是做这样的事情
predicateString += "((SUBQUERY(aB.children, $child, $child in %@).@count + SUBQUERY(aC.children, $child, $child in %@).@count + SUBQUERY(children, $child, $child in $@).@count) == $@)"
predicateVars.append(contentsOf: [testChildren, testChildren, testChildren, testChildren.count])
所有 children 关系的匹配总数必须匹配..不幸的是,如果相同的 child 可能出现在多个 A、B 或 C 中,那么这不会是正确的,因为在两个不同的 class 中匹配的相同 child 会导致总数不正确地匹配。
不管怎样,在 NSPredicates 中加起来似乎是不可能的?
真正正确地做到这一点的唯一方法是能够在 3 classes 中生成所有 children 的总集,但同样似乎没有在 NSPredicate 中表达这个的方法?
更糟糕的情况我可以做一个更简单的查询并对返回的结果执行更多的逻辑,但理想情况下我会尝试在查询中做尽可能多的繁重工作。
提前致谢
谓词以查找所有带有 child 的 A:
NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
AND 谓词以查找所有具有 child1
和 child2
以及 child3
和 child4
的 A:
var predicateArray:[NSPredicate] = []
for child in testChildren {
let predicate = NSPredicate(format:"aB.children contains %@ OR aC.children contains %@ OR children contains %@", child, child, child)
predicateArray.append(predicate)
}
let finalPredicate = NSCompoundPredicate(andPredicateWithSubpredicates:predicateArray)
上述 Willeke 回答的另一个版本是构建描述为带有变量的字符串的谓词,如此处所示
var predicateString:String = ""
var predicateVars:[Any] = []
for child in testChildren
{
if (predicateString.count > 0)
{
predicateString += " && "
}
predicateString += "(aB.children contains %@ || aC.children contains %@ || children contains %@)"
predicateVars.append(contentsOf: [child, child, child])
}
let predicate = NSPredicate(format: predicateString, argumentArray: predicateVars)