function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Adriana Reyes 26Adriana Reyes 26 

Move child record query outside of for loop

Hello!

So I have a list of parent records called ServiceContract, and as I'm looping through each parent record, I query for the child records called ContractLineItem for that specific parent record, then I use those line items to do something else. My first instinct is to query for those child records inside of the for loop, and I know that is not the correct way to do it. I was hoping someone could show me how to fix my code the correct way. I appreciate the help.
 
//ServiceContract parent record list
        for (ServiceContract selectedContract : selectedContracts) {
            
            //Get child contract line records
            List<ContractLineItem> contractLines =[SELECT id, Product2Id, Quantity, Discount, UnitPrice, ServiceContractId, Description, Product_Reference_ID__c 
                                                   FROM ContractLineItem WHERE ServiceContractId = :selectedContract.Id];
            
            for (ContractLineItem contractLine : contractLines)
            {
                gii__ServiceOrderLine__c serviceLine = new gii__ServiceOrderLine__c ();
                serviceLine.gii__SalesOrder__c = selectedContract.Sales_Order__c;
                serviceLine.gii__OrderQuantity__c = contractLine.Quantity;
                serviceLine.gii__UnitPrice__c = contractLine.UnitPrice;

                serviceLineList.add(serviceLine);
            }
        }
        
        insert serviceLineList;
Best Answer chosen by Adriana Reyes 26
Sai PraveenSai Praveen (Salesforce Developers) 
Hi Adriana,

Can you try the below  code instead of above code.
 
Map<id,ServiceContract> mapservice= new map<id,ServiceContract>();

        for (ServiceContract selectedContract : selectedContracts) {

            mapservice.add(selectedContract.id,selectedContract);
        }

        List<ContractLineItem> contractLines =[SELECT id, Product2Id, Quantity, Discount, UnitPrice, ServiceContractId, Description, Product_Reference_ID__c 
                                                   FROM ContractLineItem WHERE ServiceContractId in :mapservice.keyset() ];

    For(ContractLineItem cline:contractLines){
        gii__ServiceOrderLine__c serviceLine = new gii__ServiceOrderLine__c ();
                serviceLine.gii__SalesOrder__c = mapservice.get(cline.ServiceContractId).Sales_Order__c;
                serviceLine.gii__OrderQuantity__c = cline.Quantity;
                serviceLine.gii__UnitPrice__c = cline.UnitPrice;
                serviceLineList.add(serviceLine);
    }
    insert serviceLineList;

If this solution helps, Please mark it as best answer.

Thanks,
​​​​​​​

All Answers

Sai PraveenSai Praveen (Salesforce Developers) 
Hi Adriana,

Can you try the below  code instead of above code.
 
Map<id,ServiceContract> mapservice= new map<id,ServiceContract>();

        for (ServiceContract selectedContract : selectedContracts) {

            mapservice.add(selectedContract.id,selectedContract);
        }

        List<ContractLineItem> contractLines =[SELECT id, Product2Id, Quantity, Discount, UnitPrice, ServiceContractId, Description, Product_Reference_ID__c 
                                                   FROM ContractLineItem WHERE ServiceContractId in :mapservice.keyset() ];

    For(ContractLineItem cline:contractLines){
        gii__ServiceOrderLine__c serviceLine = new gii__ServiceOrderLine__c ();
                serviceLine.gii__SalesOrder__c = mapservice.get(cline.ServiceContractId).Sales_Order__c;
                serviceLine.gii__OrderQuantity__c = cline.Quantity;
                serviceLine.gii__UnitPrice__c = cline.UnitPrice;
                serviceLineList.add(serviceLine);
    }
    insert serviceLineList;

If this solution helps, Please mark it as best answer.

Thanks,
​​​​​​​
This was selected as the best answer
Adriana Reyes 26Adriana Reyes 26
Hi Sai,

Thank you so much! This worked like a charm. The only thing that needed to be changed was mapservice.add(selectedContract.id,selectedContract); to mapservice.put(selectedContract.id,selectedContract);

I really appreciate it.