使用 nspredicate 获取具有最大属性值的实体以及一个关系

Posted

技术标签:

【中文标题】使用 nspredicate 获取具有最大属性值的实体以及一个关系【英文标题】:Fetch entity with max attribute value as well as in to one relationship using nspredicate 【发布时间】:2015-04-04 05:48:54 【问题描述】:

例如,我的应用程序有两个实体:Department > Employee。我想获取一个employee 对象,该对象在一个特定的department 对象中具有最大salary 值。 salaryEmployee 的一个属性。

我尝试了以下代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"department == %@ && salary == max(salary)", self.department];

但是没有任何对象返回。

使用 nspredicate 完成此任务的最有效和正确的方法是什么?

有人可以帮助我吗?谢谢。

【问题讨论】:

你有什么错误吗? 【参考方案1】:

您应该修改谓词以仅过滤部门,然后使用排序描述符按薪水降序对结果进行排序。然后将 fetch limit 设置为 1,这样你就只会得到薪水最高的 Employee:

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"department == %@", self.department];
NSSortDescriptor *salarySort = [NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:NO];
fetch.sortDescriptors = @[salarySort];
fetch.fetchLimit = 1;

【讨论】:

谢谢,这种方式应该可行!但我不能确保这是对核心数据进行此类查询的有效方法,因为我的应用程序有大量数据集。【参考方案2】:

一个有效的解决方案是只使用关系而不是获取请求。 Core Data 在幕后进行优化,因此您不必担心性能或内存问题。

Employee *highestPaid = [department.employees sortedArrayUsingSortDescriptors:
  @[[NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:NO]]].firstObject

【讨论】:

以上是关于使用 nspredicate 获取具有最大属性值的实体以及一个关系的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 搜索具有 nil 值的连接表

NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象

通过对象的枚举属性使用 NSPredicate 获取核心数据托管对象的问题

NSPredicate,使用一对多关系的子集获取结果

NSPredicate 获取给定值下属性的最大值

NSPredicate 在获取请求中使用 @max 和其他条件