Как написать NSPredicate для атрибута поиска даты отношения ко многим? - PullRequest
0 голосов
/ 26 января 2019

У меня есть объект «Пациент», имеющий отношение «многие» к объекту «Акт» (Patient.acts) Объект Act имеет атрибут startDate типа Date

Я пытаюсь написать NSPredicate, чтобы получить всех пациентов, у которых есть хотя бы один акт, чья начальная дата сегодня

Я на XCode 10, использую swift 4.2

Я не могу понять правильное левое выражение в:

let start = NSExpression(forConstantValue: Calendar.current.startOfDay(for: Date()))
let end = NSExpression(forConstantValue: Calendar.current.endOfDay(for: Date()))
let todayRange = NSExpression(forAggregate: [start, end])
let actToday = NSComparisonPredicate(leftExpression: ????, rightExpression: todayRange, modifier: .any, type: .between, options: [])

для leftExpression, я пробовал несколько вариантов, но ничего не работает:

let left = NSExpression(forConstantValue: "acts.startDate")

Я пробовал подход с использованием предиката:

let actDate = NSPredicate(format: "$x.startDate")
let left = NSExpression(forSubquery: NSExpression(forKeyPath: "acts"), usingIteratorVariable: "x", predicate: actDate2)

ОБНОВЛЕНИЕ и ответ

Я придумал следующее выражение:

let seenToday = NSPredicate(format: "SUBQUERY(acts, $v, $v.actStartDate => %@ && $v.actStartDate < %@).@count!=0", argumentArray:[startToday, endToday] )

Спасибо Вадиану за ответ. Теперь я задаюсь вопросом: эффективнее ли это делать так, как предлагает vadian, или адекватен мой предикат подзапроса.

1 Ответ

0 голосов
/ 26 января 2019

Я бы порекомендовал извлечь все акты на указанную дату и сопоставить их с их атрибутом пациента (при условии, что в Act имеется соответствующая обратная связь)

let interval = Calendar.current.dateInterval(of: .day, for: Date())!
let fetchRequest : NSFetchRequest<Act> = Act.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "startDate BETWEEN %@", [interval.start, interval.end] as [CVarArg])

Затем выберите действия и сопоставьте результат с набором пациентов

let acts = try context.fetch(fetchRequest)
let patients = Set(acts.map{$0.patient})
...