基本上,我需要一个单一的 SOQL 查询,可以使用 Web 服务 API 执行,它将返回所有 NoteAndAttachment 项目,这些项目通常会显示在 Salesforce Web UI 中帐户页面的“备注和附件”部分中。这不仅包括附加到帐户本身的 N&A,还包括附加到与帐户相关的任何案例、机会或联系人的 N&A。Salesforce 本身获取这些信息似乎没有问题,但是在 SOQL 的限制和数据模型的限制之间,我还没有找到令人满意的解决方案。
这是我到目前为止所拥有的:
SELECT Id,
(select Id, Title, IsNote from NotesAndAttachments),
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
(select Id, Title, IsNote from Cases.NotesAndAttachments),
(select Id, Title, IsNote from Opportunities.NotesAndAttachments)
FROM Account a WHERE Id = '{0}'
{0} 用于 .NET String.Format;这将是我要为其提取记录的帐户 ID。此特定查询失败,但出现以下异常:
System.Web.Services.Protocols.SoapException : INVALID_FIELD:
(select Id, Title, IsNote from Contacts.NotesAndAttachments),
^
ERROR at Row:3:Column:48
Didn't understand relationship 'Contacts' in field path. If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. Please reference your WSDL or the describe call for the appropriate names.
这些都是基本的、系统定义的关系,它也不识别单数的“联系人”,所以我很茫然。
其他解决方案涉及半连接子选择(有两个限制,您不能将它们与“OR”组合,所以没有骰子),嵌套子查询(不能)等。我真的很机智以这种查询语言的限制结束;没有UNION,子查询有限,子查询深度有限,无法直接查询NoteAndAttachment实体。必须有一种方法来获取这些记录,就像它们在网站上显示的方式一样,但我每时每刻都感到沮丧。
编辑:我现在的答案是查询每个包含对象类型(帐户、联系人、机会)的 NotesAndAttachments 属性,并从案例中提取附件并将它们投影为 NotesAndAttachments 以获得我需要的信息。这个过程需要四次往返,5 条记录的摘要信息(没有注释正文或文件二进制文件)平均需要大约 15 秒。我能够将数据检索推送到异步线程,从而减少检索时间,但性能可能仍然不能令人满意。我将继续研究性能更高的东西,但现在我已经让它工作了。