从多级 SOQL 查询中获取父记录列表

Get list of parent records from multilevel SOQL query

我试图将 3 个单独的 SOQL 查询合并为一个,但最终还是得到了 3 个单独的列表,以便于以后使用和阅读。

List<Object__c> objectList = [SELECT Name, Id, Parent_Object__r.Name, Parent_Object__r.Id,
                                   (SELECT Name, Id FROM Child_Objects__r)
                                FROM Object__c];

我知道我可以这样得到一个子对象列表:

List<Child_Object__c> childObjectList = new List<Child_Object__c>();
for(Object__c object : objectList){
   childObjectList.addAll(object.Child_Objects__r);
}

我该如何将 Parent_Object__c 记录添加到它们自己的列表中? 我假设地图可用于处理重复项,但如何将此 Parent_Object__c 数据放入该地图?

你基本上就在那里。

所有查找字段在您的示例中都可用 object.Parent_Object__r。使用 Set 来避免重复。您无需删除重复数据!

Set<Parent_Object__c> parentObjectSet = new Set<Parent_Object__c>();
List<Child_Object__c> childObjectList = new List<Child_Object__c>();
for(Object__c object : objectList){
  childObjectList.addAll(object.Child_Objects__r);
  parentObjectSet.add(object.Parent_Object__r);
}

编辑:

根据@eyescream(相信他!),您最好使用地图来避免重复。

所以上面的代码只是略有不同:

Map<Id, Parent_Object__c> parentObjectMap = new Map<Id, Parent_Object__c>();
List<Child_Object__c> childObjectList = new List<Child_Object__c>();
for(Object__c object : objectList){
  childObjectList.addAll(object.Child_Objects__r);
  if (object.Parent_Object__r != null) {
    parentObjectMap.put(object.Parent_Object__r.Id, object.Parent_Object__r);
  }
}