1

我正在获取实体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>
4

2 回答 2

2

这是对原始问题、GCTANM 的回答和评论的回应(我的想法太长了,无法发表评论)。

这里似乎有一些困惑,我想澄清一下。

GCTAN:

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

...

对于这些联系人记录的任何其他属性,您必须获取每个联系人的 ID 并执行我评论中提到的检索调用之一。

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

查斯特

顾名思义,Fetch 只会返回一个结果,不是吗?

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

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

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

回答原来的问题。

因此,您可能难以取回属性的原因是返回的 EntityCollection 具有在 Crm 2011 中引入的稍微特殊的行为。

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

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

我不记得确切的格式,我正在努力寻找一个像样的例子。我建议您在查询后设置断点并检查结果,我确信您会找到数据但名称如上。

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

于 2012-09-27T22:28:02.300 回答
0

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

但是,当您在帐户查询中包含该primarycontactid属性时,该属性将是一个包含联系人的属性。不过这是巧合,因为该属性是实体的“主名称”属性,而这正是在对象中使用的。ColumnSetEntityReferenceNamefullnamefullnamecontactEntityReference

根据您的要求详细说明:

RetrieveMultiple接受一个QueryBase对象(最常见的是 a 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子句),它的Attributes集合将包含一个 keyed 项primarycontactid,并且值将是 type EntityReference

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

但正如我所说,这是一个巧合,对于这些联系人记录的任何其他属性,您必须获取每个联系人的 ID 并Retrieve拨打我评论中提到的电话之一。

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

于 2012-09-27T17:16:22.180 回答