不理解字段路径中的关系 'LinkedEntityId'

Didn't understand relationship 'LinkedEntityId' in field path

所以我通常能够查询关系,但我无法在对象管理器中访问此对象,所以当我知道 LinkedEntity 是一个案例时,从 ContentDocumentLink 对象访问 accountId 的查询应该是什么。

我的代码:

List<ContentDocumentLink> case_file_links=
  [
  SELECT Id,ContentDocumentId,LinkedEntityId.AccountId,ShareType
  FROM ContentDocumentLink
    WHERE Id IN: case_file_link_Ids
  ];

错误:

  SELECT Id,ContentDocumentId,LinkedEntityId.AccountId,ShareType
                              ^
ERROR at Row:2:Column:45
Didn't understand relationship 'LinkedEntityId' in field path. If you..

LinkedEntityId 是对许多 table 的奇怪突变查找,任何支持文件上传的 table。正式名称是“polymorphic lookup”。

也许您以前使用过 Tasks,它们有相似的领域。 WhatId 可以指向 Account、Case、Opportunity 以及许多自定义对象。 WhoId 指向 User/Contact/Lead.

所以这是对“某物”的查找。不能保证它是 Cases,所以在编译时 SF 不能盲目地接受 AccountId。如果该字段不存在怎么办。

您可能必须在 SOQL 中使用 TYPEOF

SELECT Id, ContentDocumentId, ShareType,
    TYPEOF LinkedEntity WHEN Case THEN CaseNumber, Subject, AccountId END
FROM ContentDocumentLink
WHERE Id IN ('06A7a000001VafmEAC', '06A7a000001VafnEAC')

Developer Console 太笨了,无法正确显示,但 workbench 应该管理

在 Apex 中,您将需要一个 instanceof 来检查并将 LinkedEntity 转换为正确的 sObject...或使用通用 sObj.get('AccountId'),如果它不存在,它将 return 空?

如果这听起来太麻烦 - 您可以随时将其拆分为 2 个查询。

  1. 只查询SELECT Id, ContentDocumentId, LinkedEntityId, ShareType FROM ContentDocumentLink
  2. 遍历结果,将 LinkedEntityId 收集到助手 Set<Id> 中。
  3. Map<Id, Case> cases = new Map<Id, Case>([SELECT Id, AccountId FROM Case WHERE Id IN :mySet]);