我有 2 个实体:发票和产品,它们与发票中的“产品”的“对多”关系相关(Invoice.products 是该发票的产品实体列表)。
我正在尝试使用聚合查询来检索给定产品在任何发票上开具发票的次数。假设我有 2 张发票:
发票 1
产品一
产品 2
发票 2
产品 2
产品 3
我想要计算产品 1 已开具发票的次数。在这种情况下,1. # 次产品 2 已开具发票?2.
如果我查询计数:产品 1 出现的次数,它返回 2,因为 Invoice 1 有 2 个产品,它应该是 1。在下面的代码中,谓词过滤任何“Invoice " 拥有产品 1 的实体,一旦找到产品,它就会计算产品的数量,无论产品 ID 是什么:
//Create an aggregate query on Invoice
//create the NSExpression to tell our NSExpressionDescription which attribute we are performing the calculation on
NSExpression *keyExpression = [NSExpression expressionForKeyPath:@"products.quantity"];
//create the NSExpression to tell our NSExpressionDescription which calculation we are performing.
NSExpression *maxExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyExpression]];
NSExpressionDescription *description = [[NSExpressionDescription alloc] init];
[description setName:@"quantityCount"];
[description setExpression:maxExpression];
[description setExpressionResultType:NSDoubleAttributeType];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate getManagedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Invoice"];
[request setPredicate:[NSPredicate predicateWithFormat:@"(deletedDate == nil) AND (products.id CONTAINS %@)", product.id]];
NSError *error;
[request setPropertiesToFetch:[NSArray arrayWithObject:description]];
[request setResultType:NSDictionaryResultType];
NSArray *results = [context executeFetchRequest:request error:&error];
if (results != nil && results.count > 0)
{
NSDecimalNumber *quantityCount = [[results objectAtIndex:0] valueForKeyPath:@"quantityCount"];
NSLog(@"The count for this product is: %@", quantityCount);
}
我的问题是,如何执行仅计算产品 1 数量的聚合查询?我觉得我需要以不同的方式或在另一个地方为我的获取请求添加标准。任何帮助,将不胜感激!
以下是我的数据模型在 xcode 中的样子的链接: