查询ContentDocumentLink的AccountId时提示LinkedEntityId关系无法识别怎么办
报错原因
LinkedEntityId是ContentDocumentLink上的多态引用字段,可关联Case、Account、Opportunity等多种不同对象,不能直接通过LinkedEntityId.字段名的方式跨对象取数,必须使用SOQL的多态查询语法TYPEOF指定关联对象类型后再取对应字段。
正确查询写法
你已经明确所有关联的LinkedEntity都是Case,直接用下面的SOQL即可:
List<ContentDocumentLink> case_file_links = [ SELECT Id, ContentDocumentId, ShareType, TYPEOF LinkedEntity WHEN Case THEN AccountId END FROM ContentDocumentLink WHERE Id IN :case_file_link_Ids ];
取值方法
查询返回后,你可以通过以下方式拿到对应AccountId:
for(ContentDocumentLink cdl : case_file_links) { // 先判断LinkedEntity确实是Case类型,避免空指针 if(cdl.LinkedEntity instanceof Case) { Id relatedAccountId = ((Case)cdl.LinkedEntity).AccountId; // 后续业务逻辑 } }
替代方案(兼容旧版API/不支持TYPEOF的场景)
如果你的org使用的API版本低于26.0不支持TYPEOF语法,可以先查ContentDocumentLink拿到所有LinkedEntityId,再批量查询Case取AccountId:
// 第一步查所有关联的Case Id List<ContentDocumentLink> case_file_links = [ SELECT Id, ContentDocumentId, LinkedEntityId, ShareType FROM ContentDocumentLink WHERE Id IN :case_file_link_Ids AND LinkedEntity.Type = 'Case' ]; // 收集Case Id批量查询 Set<Id> caseIds = new Set<Id>(); for(ContentDocumentLink cdl : case_file_links) { caseIds.add(cdl.LinkedEntityId); } Map<Id, Case> caseMap = new Map<Id, Case>([SELECT Id, AccountId FROM Case WHERE Id IN :caseIds]); // 取值 for(ContentDocumentLink cdl : case_file_links) { Id relatedAccountId = caseMap.get(cdl.LinkedEntityId)?.AccountId; }
内容的提问来源于stack exchange,提问作者Harsh Prakash Agarwal
相关产品推荐
相关产品推荐

