.net Salesforce SOQL查询;附注及附件;场地

.net Salesforce SOQL查询;附注及附件;场地,.net,web-services,salesforce,soql,.net,Web Services,Salesforce,Soql,基本上,我需要一个SOQL查询,可使用web服务API执行,该查询将返回Salesforce web UI中帐户页面的Notes和Attachments部分中通常显示的所有NoteAndAttachment项。这不仅包括附加到帐户本身的N&A,还包括附加到与帐户相关的任何案例、机会或联系人的N&A。Salesforce本身似乎在获取这些信息方面没有问题,但在SOQL限制和数据模型限制之间,我还没有找到令人满意的解决方案 以下是我目前掌握的情况: SELECT Id, (select Id, Ti

基本上,我需要一个SOQL查询,可使用web服务API执行,该查询将返回Salesforce web UI中帐户页面的Notes和Attachments部分中通常显示的所有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}'
{0}用于.NET字符串.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.
这些都是基本的,系统定义的关系,它也不认识单一的“接触”,所以我不知所措

其他解决方案包括半连接子选择(有两个限制,不能与“或”组合,因此没有骰子)、嵌套子查询(不能)等。我真的对这种查询语言的限制束手无策;无法直接查询联合、有限子查询、有限子查询深度以及NoteAndAttachment实体。必须有一种方法来获取这些记录,就像它们在网站上显示的那样,但我每次都感到沮丧


编辑:我现在的答案是查询每个包含对象类型(帐户、联系人、商机)的NotesAndAttachments属性,并从案例中提取附件,并将其作为NotesAndAttachments进行投影,以获取我需要的信息。此过程需要四次往返,5条记录的摘要信息(无注释正文或文件二进制文件)平均需要约15秒。我能够将数据检索推到一个异步线程,这减少了检索时间,但性能可能仍然不令人满意。我会继续做一些性能更好的工作,但现在我已经让它工作了。

从sobject开始,你可能会有更好的运气


您可能需要在多个查询中执行此操作。根据关系的方向,关系查询有一些限制。参见

这里似乎有两个问题

  • 无法直接查询Notes和Attachments对象-这是Notes和Attachments对象的组合
  • 只能向下查询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}'
    

    我想知道对所有附件进行一次查询,对所有注释进行另一次查询,是否更好,无论它们有哪种父对象,例如:

    SELECT Id, Name, parent.Id, parent.Name, parent.Type FROM Attachment
    SELECT Id, Title, parent.Id, parent.Name, parent.Type FROM Note
    
    通过这种方式,您可以使用父类型对附件进行分组,您将获得所有可用的附件,并且应该更快

    如果您真的需要限制这种类型的对象,请执行以下操作:

    SELECT Id, Name, parent.Id, parent.Name, parent.Type FROM Attachment where parent.type like '%Account%' OR parent.type like '%Contact%' OR parent.type like '%Case%' OR parent.type like '%Opportunity%' 
    

    希望能有帮助。

    我从salesforce方面找到的

    子查询中当前不支持以下对象:

    活动历史

    附件

    事件

    活动参与者

    开放活动

    标记(AccountTag、ContactTag和所有其他标记对象)

    任务

    参考:

    我逐渐意识到这一点。目前我有四个查询调用,它们从notes和attachments中提取摘要数据以显示在列表中;要查看详细信息,用户可以获取单个记录的完整数据。但是,运行所有四个查询需要整整15秒才能从我的测试帐户返回总共5条记录。