Предположим, что у меня есть 2 объекта, Person
и Transaction
.NSExpression относится к подзапросу NSPredicate
Person
имеют отношение ко многим с Transaction
Transaction
и предприятие имеет amount
и date
. Моя цель состояла в том, чтобы иметь NSFetchRequest
на основе Person
, но я хочу знать только тех, у кого есть транзакции между определенными датами и суммой транзакций SUM
.
Мой код выглядит следующим образом:
NSExpression *amountKeyPath = [NSExpression expressionForKeyPath:@"transactions.amount"];
NSExpression *sumAmountExpression = [NSExpression expressionForFunction:@"sum:" arguments:@[amountKeyPath]];
// Create the expression description for that expression.
NSExpressionDescription *description = [[NSExpressionDescription alloc] init];
[description setName:@"sum"];
[description setExpression:sumAmountExpression];
[description setExpressionResultType:NSDecimalAttributeType];
// Create the sum amount fetch request,
self.sumAmountFetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
self.sumAmountFetchRequest.resultType = NSDictionaryResultType;
self.sumAmountFetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(transactions, $t, $t.date >= %@ AND $t.date <= %@)[email protected] > 0", self.startDate, self.endDate];
self.sumAmountFetchRequest.propertiesToFetch = @[@"name", description];
Все, кажется, хорошо, но ... Когда я посмотрел на SQL-запроса генерируется, выглядит следующим образом:
SELECT t0.ZPERSONID, t0.ZNAME,
(SELECT TOTAL(t2.ZAMOUNT) FROM ZTRANSACTION t2 WHERE (t0.Z_PK = t2.ZPERSON))
FROM ZPERSON t0
WHERE (SELECT COUNT(t1.Z_PK) FROM ZTRANSACTION t1 WHERE (t0.Z_PK = t1.ZPERSON AND ((t1.ZDATE >= ? AND t1.ZDATE <= ?)))) > ?
Таким образом, кажется, что в NSExpression
объявлено, не уважает созданный файл fetchRequest NSPredicate
.
Можно ли сделать выражение также уважающим предикат, связанный с fetchRequest? Или с NSExpression
стоит сам по себе, я должен приложить к нему еще один предикат?
SQLite заявление выглядит хорошо для меня. Предикат преобразуется в последний «ГДЕ» и применяется ко всему оператору. Получаете ли вы ожидаемый результат? –
Нет, я получил количество транзакций, принадлежащих этому лицу (не ограниченное временным интервалом - предложение WHERE) – Rpranata
ОК, теперь я понимаю, что вы имеете в виду, и мой комментарий выше. –