Salesforce SOQL查询站点的"Notes和附件"

Kei*_*thS 3 .net web-services salesforce soql

基本上,我需要一个使用Web服务API执行的SOQL查询,该查询将返回通常显示在Salesforce Web UI中"帐户"页面的"注释和附件"部分中的所有NoteAndAttachment项目.这不仅包括附加到帐户本身的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}'
Run Code Online (Sandbox Code Playgroud)

{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.
Run Code Online (Sandbox Code Playgroud)

这些都是基本的,系统定义的关系,它也不承认单一的"联系",所以我很茫然.

其他解决方案涉及半连接子选择(有两个限制,你不能将它们与"OR"组合,所以没有骰子),嵌套子查询(不能)等等.我真的在我的智慧以此查询语言的局限性结束; 不能直接查询UNION,有限的子查询,有限的子查询深度和NoteAndAttachment实体.只需要一种方法来获得这些记录的方式与它们在网站上显示的方式相同,但我在任何时候都感到沮丧.

编辑:我现在的答案是查询每个包含对象类型(帐户,联系人,机会)的NotesAndAttachments属性,并从Case中提取附件并将​​它们作为NotesAndAttachments投影以获取我需要的信息.此过程需要四次往返,并且对于5条记录的摘要信息(没有记录正文或文件二进制文件)平均需要大约15秒.我能够将数据检索推送到异步线程,这减少了检索时间,但性能可能仍然不能令人满意.我将继续努力提高性能,但现在我已经开始工作了.

小智 5

这里似乎有两个问题......

  1. 您无法直接查询NotesAndAttachments对象 - 这是Notes和Attachments对象的组合.
  2. 您只能在父母与子女之间的关系中查询1级.您可以对"联系人"进行子查询,但不能对联系人的备注或附件进行子查询.

我认为你唯一的选择就是做四个查询.但是,如果您循环遍历多个帐户ID,这可能会花费大量API调用.

SELECT Id,
(SELECT Id, Title FROM Notes),
(SELECT Id, Name FROM Attachments)
FROM Account WHERE Id = '{0}'

SELECT Id,
(SELECT Id, Title FROM Notes),
(SELECT Id, Name FROM Attachments)
FROM Contact WHERE AccountId = '{0}'

SELECT Id,
(SELECT Id, Title FROM Notes),
(SELECT Id, Name FROM Attachments)
FROM Case WHERE AccountId = '{0}'

SELECT Id,
(SELECT Id, Title FROM Notes),
(SELECT Id, Name FROM Attachments)
FROM Opportunity WHERE AccountId = '{0}'
Run Code Online (Sandbox Code Playgroud)