访问`RetrieveMultiple`中的数据

时间:2012-09-27 17:09:34

标签: c# dynamics-crm fetchxml

我正在提取ContactAccount个实体,我希望访问联系人的姓名和主要联系人的姓名。

可以很容易地访问第一个
EntityCollection result = proxy.RetrieveMultiple(...);
Entity entity = result.Entities[0].Attributes["fullname"];
另一个似乎在打我一个例外。到目前为止,我可以看到,它取决于前一种情况下<entity>中直接具有名称属性的获取XML,后者中位于<entity><link-entity>下。

如何访问作为链接实体的字段fullname


获取联系人的XML:

<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='contact'>
    <attribute name='fullname' />
  </entity>
</fetch>

获取帐户主要联系人的XML:

<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='account'>
    <attribute name='accountid'/>
    <link-entity name='listmember' from='entityid' to='accountid' visible='false' intersect='true'>
      <link-entity name='list' from='listid' to='listid' alias='ab'>
      </link-entity>
    </link-entity>
    <link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='...'>
      <attribute name='fullname'/>
    </link-entity>
  </entity>
</fetch>

2 个答案:

答案 0 :(得分:2)

这是对原始问题的回复,GCTANM的回答和评论(我的评论对于评论来说太长了。)

这里似乎有一些混乱,我想澄清一下。

<强> GCTANM:

  

RetrieveMultiple只能使用LinkEntities进行选择   不能返回除主要实体以外的实体的属性   查询。

     

...

     

用于任何其他属性   那些联系人记录,你必须拿每个联系人的ID并做一个   在我的评论中提到的那些检索电话。

这些陈述不正确,您也可以返回所有链接实体的属性。 MSDN上有一个例子。

<强> Chamster

  

根据其名称的声音,Fetch只返回一个结果,   不是吗?

FetchXml返回单个结果集,但该结果集可以包含许多记录的详细信息。

  

不知何故,我更喜欢使用XML而不是实体

如果你真的(真的真的)想要这样做,你可以使用Crm 4 Web服务,RetrieveMultiple仍然会返回一个Xml结果集。

回答原始问题。

所以你可能会努力找回你的属性,因为返回的EntityCollection在Crm 2011中引入了一个稍微独特的行为。

简而言之,Crm 4 FetchXml查询将返回您必须解析的Xml结果,在2011年帮助Microsoft将结果解析为EntityCollection。这导致一些属性具有非常意外的名称。

因此,以上面的联系方式为例,您必须使用以下内容访问fullname属性:contact1.fullname,联系人是链接,数字代表链接数量,fullname是属性。

我不记得确切的格式,我正在努力寻找一个体面的例子。我建议你在查询之后设置一个断点并检查结果,我确定你会找到这些数据但是上面有这样的名字。

如果我能找到一个体面的例子(或明天创建一个例子),我会更新我的帖子。

答案 1 :(得分:0)

RetrieveMultiple只能使用LinkEntities进行选择,它不能返回查询主要实体以外的实体的属性。

但是,当您在primarycontactid中为帐户查询添加ColumnSet属性时,EntityReference属性Name的{​​{1}}属性包含fullname的联系方式。 但这很巧合,因为fullname属性是contact实体的“主要名称”属性,这就是EntityReference对象中使用的属性。

按照您的要求进行阐述:

RetrieveMultiple使用QueryBase个对象(最常见的是QueryExpression),它有一个名为ColumnSet的属性来定义要返回的属性(这可能会产生影响)性能,特别是对于具有许多字段的实体)。

在您的情况下,它可能设置如下:

QueryExpression qryAccounts = new QueryExpression("account")
{
    ColumnSet = new ColumnSet("accountid", "name", "primarycontactid")
};

qryAccounts.Criteria.AddCondition("primarycontactid", ConditionOperator.NotNull);

qryAccounts.AddLink("list", "accountid", "entityid");


EntityCollection collAccounts = svcOrganization.RetrieveMultiple(qryAccounts);

现在,如果collAccounts.Entities中返回的任何记录都有主要联系人(在这种情况下,他们都会,因为这是我们的条件之一,又名select条款),它的{{ 1}}集合将包含一个键入Attributes的项目,其值将为primarycontactid类型。

这具有属性EntityReferenceId(这是被引用实体的名称,在本例中为“contact”)和LogicalName,这是实体主要的值名称属性;对于Name,即contact(对于fullname它是account,依此类推 - 始终是您在相应实体的网格或查找中看到的名称。)

但正如我所说,这是巧合,对于这些联系人记录的任何其他属性,您必须获取每个联系人的ID并执行我的评论中提到的name次呼叫之一。

Retrieve使用实际的FetchXML(结果也是XML)可以直接返回链接记录的属性,据我所知。