我在salesforce平台上工作。我有这个循环来获取所有组名,ID和他们各自的组成员,将它们放在一个对象中以收集所有这些信息,然后将其放在一个列表中,以获得所有组的列表和我需要的所有信息:
List<groupInfo> memberList = new List<groupInfo>();
for(Id key : groupMap.keySet()){
groupInfo newGroup = new groupInfo();
Group g = groupMap.get(key);
if(g.Name != null){
set<Id> memberSet = getGroupEventRelations(new set<Id>{g.Id});
if(memberSet.size() != 0){
newGroup.groupId = g.Id;
newGroup.groupName = g.Name;
newGroup.groupMemberIds = memberSet;
memberList.add(newGroup);
}
}
}
我的getGroupEventRelations方法是这样的:
global static set<Id> getGroupEventRelations(set<Id> groupIds){
set<Id> nestedIds = new set<Id>();
set<Id> returnIds = new set<Id>();
List<GroupMember> members = [SELECT Id, GroupId, UserOrGroupId FROM GroupMember WHERE GroupId IN :groupIds];
for(GroupMember member : members){
if(Schema.Group.SObjectType == member.UserOrGroupId.getSObjectType()){
nestedIds.add(member.UserOrGroupId);
} else{
returnIds.add(member.UserOrGroupId);
}
}
if(nestedIds.size() > 0){
returnIds.addAll(getGroupEventRelations(nestedIds));
}
return returnIds;
}
getGroupEventRelations包含一个soql查询,考虑到这是在一个组循环中调用的...如果某个人有超过100个组成员组或者可能是一组100个嵌套组在组内......那么这将是命中salesforce soql的管理限制非常快......
我想知道是否有人知道一种方法可能摆脱getGroupEventRelations中的soql查询以摆脱循环中的查询。当我想要一个特定组的组成员时,我并没有真正找到一种方法来实现这一目标,而在循环内部没有更多循环,我可能会冒险进入CPU超时salesforce管理限制:(
提前感谢您的帮助!
答案 0 :(得分:0)
足够多的数字没有解决方案,你会遇到一些州长限制。但是你可以使你的代码使用比现在更大的数字。 这是一个快速的小作弊,你可以做5次切割嵌套。而不只是查看直接父(单个级别的孩子),在一个查询中查找父,祖父母,曾祖父母等等。
[SELECT Id,GroupId,UserOrGroupId FROM GroupMember WHERE(GroupId IN:groupIds OR Group.GroupId IN:groupIds OR Group.Group.GroupId IN:groupIds OR Group.Group.Group.GroupId IN:groupIds OR Group.Group。 Group.Group.GroupId IN:groupIds OR Group.Group.Group.Group.Group.GroupId IN:groupIds)AND Id NOT IN:returnIds];
在一次SOQL调用中,您只有5个(或者是6?)级别的子级,因此您现在可以支持多次嵌套级别。请注意,我添加了一个“NOT IN”子句,以确保您不会重复已有的子项,因为您不会知道哪个ID来自底层。
您也可以一次拨打所有群组,而不是每个群组。因此,如果某人有100个群组,您只需拨打一个电话而不是100个电话。
List<Group> groups = groupMap.values();
List<GroupMember> allMembers = [SELECT Id, GroupId, UserOrGroupId FROM GroupMember WHERE GroupId IN :groups];
最后,您可以在单个SOQL调用中查询所有GroupMembers,然后自行迭代。就像你说的那样,你冒险在这里遇到10秒的限制,但是如果组的数量不是数百万,你可能会很好,特别是如果你做一些O(n)分析并选择好的数据结构和算法。从好的方面来说,无论嵌套和树的复杂性如何,您都不必担心SOQL限制。这个答案应该非常有用,如果你在一个电话中拉出所有成员,它们几乎完全是你必须要做的。 How to efficiently build a tree from a flat structure?