避免销售人员管理限制soql查询获取每个组的组成员?

时间:2017-02-24 16:34:08

标签: dictionary salesforce limit apex soql

我在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管理限制:(

提前感谢您的帮助!

1 个答案:

答案 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?