如何在Dynamics CRM4 C#插件中迭代1:N关系

时间:2012-04-17 03:40:45

标签: plugins dynamics-crm crm dynamics-crm-4

我们的帐户实体与'BookingAccount'(自定义实体)有1:N的关系。关系的名称是new_Account_new_BookingAccount。在插件中,如果我尝试迭代集合

foreach (new_BookingAccount ba in myAccount.new_Account_newBookingAccount)
{
    ...
}

它是空的 - 即使有相关的BookingAccounts。

我应该重新查询BookingAccounts还是可以在集合属性上调用一些'populate'方法?如果是这样,最好的方法是什么?如果你不能迭代它,那么集合属性的重点是什么。

感谢您提前提供任何帮助。

2 个答案:

答案 0 :(得分:1)

您的代码应该有效。如果您将使用早期绑定实体类编写客户端,您将看到此类集合利用通用GetRelatedEntity方法。代码如下:

        /// <summary>
        /// 1:N account_activity_parties
        /// </summary>
        [Microsoft.Xrm.Sdk.RelationshipSchemaNameAttribute("account_activity_parties")]
        public System.Collections.Generic.IEnumerable<MyCrmNamespace.ActivityParty> account_activity_parties
        {
            get
            {
                return this.GetRelatedEntities<MyCrmNamespace.ActivityParty>("account_activity_parties", null);
            }
            ...
        }

此代码应适用于所有情况。当然,可能存在一些安全问题。您的代码在某些CRM用户凭据下执行,您应该确保用户具有足够的权限来浏览这两个实体 但是最重​​要的是你应该注意,它是如何检索实例myAccount的。你提到这个代码是在插件里面使用的。但是你没有提到它是什么样的插件(前期,后期),你在这个插件中处理了什么样的消息,你怎么样?检索实体myAccount的实例。如果直接调用retrieve方法,则应填充所有属性。但如果myAccount来自输入参数,则无法保证将为所有属性设置所有实际值。可能是这个集合为空的原因。

答案 1 :(得分:1)

啊 - 需要明确加载集合:

orgContext.LoadProperty(account, "new_BookingAccount_new_ExternalCode");
foreach (new_BookingAccount ba in myAccount.new_Account_new_BookingAccount)
{
    ...
}

(虽然如果accouont是一个新实体,这是不可能的,所以事先需要进行某种检查):

if (account.CreatedOn == null)
    return;

对于简单的集合迭代来说似乎很多工作