2

is there a way to optimize below util functions that retrieves Record Type Developer Name in bulk on Trigger before insert:

public static List<Account> getAccountRecordTypeDeveloperNames(List<Account> accountList){
        Set<Id> recordIDs = new Set<Id>();
        for (Account a : accountList) {
            recordIDs.add(a.Id);
        }
        List<Account> accountWithRecordTypes = new List<Account>([SELECT Id, RecordType.DeveloperName FROM Account WHERE Id  IN :recordIDs]);
        return accountWithRecordTypes;
    }

I have a similar function for when Trigger is for update as shown below:

public static Map<Id, Account> getAccountRecordTypeDeveloperNames(Map<Id, Account> accountMap){
        Map<Id,Account> accountWithRecordTypes = new Map<Id, Account>([SELECT Id, RecordType.DeveloperName FROM Account WHERE Id  IN :accountMap.keySet()]);
        return accountWithRecordTypes;

    }

Any way to optimize both functions or combine them in my class?

1 Answer 1

3

There is a method exposed on the DescribeSObjectResult class, getRecordTypeInfosById(). This method allows you to access a fast, cached, SOQL-free Map without consuming limits.

You can use this method to access data on Account record types without performing an additional query. For example,

Map<Id,Schema.RecordTypeInfo> rtMap = Account.sobjectType.getDescribe().getRecordTypeInfosById();

for (Account a : myListOfAccounts) { 
    System.debug('Record type for Account ' + a.Name 
                 + ' has developer name ' + rtMap.get(a.RecordTypeId).getDeveloperName());
}

You can optimize both methods using this approach. Please note also that your first method, as written, won't work at all, because objects in before insert context don't have Ids.

2
  • getDeveloperName() -- will this count as 1 SOQL query per account inside for loop? Just wonder what happens when I have lot of accounts and if it will hit governor limits
    – user569925
    Jun 18, 2018 at 16:02
  • 2
    Load the Map outside the loop for efficiency, but no, neither sourcing the Map nor accessing its contents counts as SOQL.
    – David Reed
    Jun 18, 2018 at 16:05

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .