假设我有2个实体,一个Person
和一个Transaction
。NSExpression尊重子查询NSPredicate
Person
有一个一对多的关系与Transaction
和Transaction
实体有amount
和date
。我的目标是建立一个基于Person
的NSFetchRequest
,但我只想知道在某些日期和交易金额的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的声明对我来说很好的SQL。谓词转换为最后一个“WHERE”并且适用于整个语句。你有预期的结果吗? –
不,我得到了属于那个人的交易金额(不限于时间范围 - WHERE子句) – Rpranata
好的,现在我明白你的意思了,我上面的评论是错误的。 –