最有效的方法来获得平均值,同时也筛选出一些对象

我试图得到一个属性在一个子实体的平均值,同时也试图只包括一组select的logging。

我的核心数据模型中有两个实体:Invoice和InvoiceDetail。

Invoice:<br> invoiceNum - attribute<br> invoiceDate - attribute<br> invoiceDetails - one-to-many relationship to InvoiceDetail InvoiceDetail:<br> itemAmount - attribute<br> itemType - attribute<br> invoice - one-to-one relationship to Invoice<br> 

如果我只想得到整个发票的itemAmount的平均值,我将使用以下(发票是一个NSManagedObject):

 float avgAmount = [[invoice valueForKeyPath:@"invoiceDetails.@avg.itemAmount"] floatValue]; 

但是,我试图只得到itemType = 1的对象的平均值。我可以循环通过invoiceDetail项目,并手动执行此操作,但我知道这将导致性能问题。 我不确定要做这件事的最好方法是什么。

谢谢你的帮助。

您可以使用包含expression式的获取请求来执行此操作,如下所示:

 - (NSDictionary *)myFetchResults { NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"InvoiceDetail" inManagedObjectContext:myContext]; request.predicate = [NSPredicate predicateWithFormat:@"itemType = %@", [NSNumber numberWithInt:1]]; request.resultType = NSDictionaryResultType; NSExpressionDescription *aveExDescr = [[NSExpressionDescription alloc] init]; [aveExDescr setName:@"myAverage"]; [aveExDescr setExpression:[NSExpression expressionForFunction:@"average:" arguments:[NSArray arrayWithObject: [NSExpression expressionForKeyPath:@"itemAmount"]]]]; [aveExDescr setExpressionResultType:NSFloatAttributeType]; request.propertiesToFetch = [NSArray arrayWithObject:aveExDescr]; NSError *err = nil; NSArray *results = [self.moContext executeFetchRequest:request error:&err]; [request release]; [err release]; return results; } 

取回将返回一个字典,您可以访问,如下所示:

 NSArray *results = [self myFetchResults]; NSDictionary *resultsDictionary = [results lastObject]; NSNumber *average = [resultsDictionary objectForKey:@"myAverage"]; 

请注意,此代码尚未经过testing。 如果你正在使用NSDecimalAttributeType ,你也可以使用NSDecimalAttributeType而不是floattypes。