0

我有以下架构:

  • 表客户:Name
  • 表顺序:OrderDate,Amount
  • 表 OrderDetails: ItemName,Amount

一对多关系就像Customer --> Orders --> OrderDetails
我需要分别获取查询和@sum表一样@countOrdersOrderDetails

我试过valueForKeyPath了,但它只适用于 Orders 表并且无法到达OrderDetails表:

[Customer valueForKeyPath:@"orders.@sum.amount"]

我正在寻找什么来获取计数Orderdetails,或者使用嵌套谓词获取计数(性能是一个问题),例如:

[Customer valueForKeyPath: @"orders.OrderDetails.@count.ItemName]
4

1 回答 1

2

你的第二个是不正确的,因为你混合了属性和类名并且错过了一个步骤。如果您想要一个客户的所有订单的订单详细信息的计数,那么您需要做更多的工作。首先让我们看看这个,而不是将所有内容都集中到一个调用中以使其更容易理解:

NSSet *orders = [customer valueForKey:@"orders"];
NSSet *details = [orders valueForKey:@"orderDetails"];
NSInteger count = [details count];

因此,它可以工作。但是你想要它在一行中。为此,我们需要在尝试计数之前组合来自多个订单的所有订单详细信息。-valueForKey:上面的代码将其作为调用a的副作用NSSet。但是我们可以故意使用 KVC 来做到这一点:

NSSet *details = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails"];
NSInteger count = [details count];

@distinctUnionOfSets告诉 KVC 调用结果-valueForKey:orders它应该期望返回一个或多个实例,NSSet并将这些实例的内容组合成一个NSSet并返回它。现在唯一剩下的就是把 count 放在最后:

NSInteger count = [customer valueForKeyPath:@"orders.@distinctUnionOfSets.orderDetails.@count"];

在您的代码中,您做错了两件事。您引用的是对象类名而不是实例名(我猜它们应该是什么),并且您没有组合返回的集合以便计数正常工作。

有关 KVC 的更多详细信息,请访问Apple 的开发者网站

于 2013-05-31T17:51:25.923 回答