Apex - 从一种地图<sobject,list <sobject =“”>&gt;中检索记录

时间:2016-03-08 11:34:11

标签: salesforce apex-code apex

我使用的是潜在客户地图,其中第一个ID表示帐户ID,而列表类似于链接到该帐户的潜在客户列表,例如:Map<id, List<Id> > leadMap = new Map< id, List<id> >();

我的问题如下:了解潜在客户ID我如何从地图中获取相关帐户的ID。我的代码看起来像这样,问题出在注释掉的行上。

 for (Lead l :  leads){

       Lead newLead = new Lead(id=l.id);
        if (l.Company != null)  {           
       // newLead.Account__c  = leadMap.keySet().get(l.id);
        leads_to_update.add(newLead);
       }          
      }

2 个答案:

答案 0 :(得分:0)

您可以将所有潜在客户ID和映射公司ID放入触发器中,然后获取公司ID

Map<string,string> LeadAccountMapping = new Map<string,string>();//key is Lead id ,Company id
for(Lead l:trigger.new)
{
     LeadAccountMapping.put(l.id,l.Company);
}


//put the code you want to get the  company id
string companyid=    LeadAccountMapping.get(l.id);

答案 1 :(得分:0)

让我确保理解你的问题。 目前,您有一张地图使用帐户ID作为潜在客户ID列表值的关键 - 因此地图为 - &gt;名单。正确的吗?

您的目标是从潜在客户ID转到帐户ID。

如果这是正确的,那么你的方式很糟糕,因为你当前的结构需要一个非常缓慢的迭代搜索。正确的代码看起来像这样(用这段代码替换你的注释行):

for( ID actID : leadMap.keySet() ) {
    for( ID leadID : leadMap.get( actId ) ) {
        if( newLead.id == leadID ) {
            newLead.Account__c = actId;
            leads_to_update.add(newLead);
            break;
        }
    }
}

我不喜欢这个解决方案,因为它需要迭代Map,然后遍历每个值中的每个列表。这很慢。

如果这不是批量化代码,您可以执行选择查询并通过执行以下操作从现有潜在客户获取Account__c值:

newLead.Account__c = [ SELECT Account__c FROM Lead WHERE Id = :l.id LIMIT 1];

但是,这依赖于您的代码没有循环遍历此行并达到调控器限制。

或者您可以重新编写代码,以确保您的地图实际上是:

Map<ID, List<Leads>> leadMap = Map<ID, List<Leads>>();

然后,在您构建地图的查询中,确保您的潜在客户还包含Account__c字段。

这些选项中的任何一个都应该有效,这完全取决于此代码段的执行方式和位置。

祝你好运!