我有以下架构:
Name
OrderDate
,Amount
ItemName
,Amount
一对多关系就像Customer --> Orders --> OrderDetails
一样
我需要分别在@sum
和@count
表格中获取查询Orders
和OrderDetails
。
我尝试了valueForKeyPath
,但它仅适用于Orders表,无法访问OrderDetails
表:
[Customer valueForKeyPath:@"orders.@sum.amount"]
我正在寻找获得Orderdetails
的计数,或使用嵌套谓词得到计数(性能是一个问题),例如:
[Customer valueForKeyPath: @"orders.OrderDetails.@count.ItemName]
答案 0 :(得分:2)
您的第二个不正确,因为您正在混合属性和类名并错过了一个步骤。如果您想要计算客户所有订单的订单详细信息,那么您需要做更多的工作。首先让我们看看这个,而不是将所有内容都放在一个调用中,以便更容易理解:
NSSet *orders = [customer valueForKey:@"orders"];
NSSet *details = [orders valueForKey:@"orderDetails"];
NSInteger count = [details count];
因此,它有效。但是你想要它在一条线上。为此,我们需要在尝试计数之前合并多个订单中的所有订单详细信息。上面的代码将此作为在-valueForKey:
上调用NSSet
的副作用。但是我们可以用KVC故意这样做:
NSSet *details = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails"];
NSInteger count = [details count];
@distinctUnionOfSets
告诉KVC对来自-valueForKey:
的结果调用orders
并且它应该期望返回NSSet
的一个或多个实例并合并内容将这些实例转换为单个NSSet
并将其返回。现在唯一剩下的就是把数字放在最后:
NSInteger count = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails.@count"];
在你的代码中,你做错了两件事。您正在引用对象类名而不是实例名称(我猜对了它们应该是什么)并且您没有组合回来的集合以便计数可以正常工作。
有关KVC的更多详情,请访问Apple's Developer Website。