我正在提取Contact
和Account
个实体,我希望访问联系人的姓名和主要联系人的姓名。
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>
答案 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
类型。
这具有属性EntityReference
,Id
(这是被引用实体的名称,在本例中为“contact”)和LogicalName
,这是实体主要的值名称属性;对于Name
,即contact
(对于fullname
它是account
,依此类推 - 始终是您在相应实体的网格或查找中看到的名称。)
但正如我所说,这是巧合,对于这些联系人记录的任何其他属性,您必须获取每个联系人的ID并执行我的评论中提到的name
次呼叫之一。
Retrieve
使用实际的FetchXML(结果也是XML)可以直接返回链接记录的属性,据我所知。