Solicitud de búsqueda de CoreData para recuento de relación y grupo por otra relación (m2n)

en mi model CoreData tengo una relación n2n modelada utilizando una entidad intermediaria:

Person [1<--] Person2Appointment [-->1] Appointment 

La entidad Person2Appointment ve así:

 @interface Person2Appointment : NSManagedObject // attributes @property (nonatomic, retain) NSNumber * participationState; // relations @property (nonatomic, retain) Person * person; @property (nonatomic, retain) Appointment * appointment; ... @end 

(ambas relaciones también se modelan como relaciones inversas en las entidades Person y Appointment )

Me gustaría get una count de todas las citas anteriores para todas las personas.

En SQL, se vería así:

 select count(fk_appointment), fk_person from person2appointment t0 left join appointment t1 on t0.fk_appointment = t1.pk where t1.date < ... group by fk_person; 

Intenté usar una expresión de function de conteo con mi búsqueda: solicite la siguiente manera:

  // create a fetch request for the Person2Appointment entity (category method) NSFetchRequest* fetch = [Person2Appointment fetchRequest]; fetch.resultType = NSDictionaryResultType; // count appointments NSExpression* countTarget = [NSExpression expressionForKeyPath: @"appointment"]; NSExpression* countExp = [NSExpression expressionForFunction:@"count:" arguments: @[countTarget]]; NSExpressionDescription* countDesc = [[NSExpressionDescription alloc]init]; countDesc.name=@"count"; countDesc.expression = countExp; countDesc.expressionResultType = NSDecimalAttributeType; fetch.propertiesToFetch = @["person", countDesc]; fetch.propertiesToGroupBy = ["person"]; fetch.pnetworkingicate = ...; 

Después de activar el logging de SQL, parece que core-data ejecuta la statement correcta:

 SELECT t0.ZPERSON, COUNT( t0.ZAPPOINTMENT) FROM ZPERSON2APPOINTMENT t0 JOIN ZAPPOINTMENT t1 ON t0.ZAPPOINTMENT = t1.Z_PK WHERE t1.ZSTARTDATE > ? GROUP BY t0.ZPERSON 

Pero los dictionarys en la matriz de resultados no contienen un conteo numérico, sino una entidad de cita:

 Printing description of d: { count = "0xd0000000000c0018 <x-conetworkingata://BABCBD2E-05AB-4AA5-AC2B-2777916E4EDF/Appointment/p3>"; person = "0xd0000000000c0016 <x-conetworkingata://BABCBD2E-05AB-4AA5-AC2B-2777916E4EDF/Person/p3>"; } 

¿Esto es un error en los datos centrales?

¿Estoy haciendo algo mal aquí?

¿O hay otra forma de lograr esto?

Eso me parece un error en CoreData, pero después de un poco de experimentación, creo que puedes lograr lo que quieres modificando la expresión de conteo, para contar un atributo de tu entidad Person2Appointment , en lugar de contar la relación de la Appointment (el conteo debería sea ​​el mismo, ya que la relación es to-one, a less que tenga valores nulos?):

 NSExpression* countTarget = [NSExpression expressionForKeyPath: @"participationState"]; NSExpression* countExp = [NSExpression expressionForFunction:@"count:" arguments: @[countTarget]]; 

Si tiene valores nulos de los que preocuparse, puede usar:

 NSExpression *countTarget = [NSExpression expressionForEvaluatedObject]; 

Solo estoy volando aquí pero podrías encontrar algo de suerte intentando una subconsulta

 NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"SUBQUERY(durationMinutes, $a, $a.date < %@)", someDate); NSInteger count = [managedObjectContext countForEntityForName:@"Person2Appointment" pnetworkingicate:pnetworkingicate error:&error];