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

Plugins 如何在Dynamics CRM4 C#插件中以1:N关系进行迭代,plugins,dynamics-crm,crm,dynamics-crm-4,Plugins,Dynamics Crm,Crm,Dynamics Crm 4,我们的账户实体与“BookingAccount”(一个自定义实体)有1:N的关系。关系的名称为new\u Account\u new\u BookingAccount。在插件中,如果我尝试迭代集合 foreach (new_BookingAccount ba in myAccount.new_Account_newBookingAccount) { ... } 它是空的-即使存在相关的预订帐户 我是应该重新查询BookingAccounts还是可以调用collection属性上的某个“

我们的账户实体与“BookingAccount”(一个自定义实体)有1:N的关系。关系的名称为new\u Account\u new\u BookingAccount。在插件中,如果我尝试迭代集合

foreach (new_BookingAccount ba in myAccount.new_Account_newBookingAccount)
{
    ...
}
它是空的-即使存在相关的预订帐户

我是应该重新查询BookingAccounts还是可以调用collection属性上的某个“填充”方法?如果是这样的话,最好的方法是什么?如果不能迭代,集合属性的意义何在


提前感谢您的帮助。

您的代码应该可以工作。若您将使用早期绑定的实体类编写客户机,您将看到这样的集合利用了泛型方法。代码如下所示:

        /// <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);
            }
            ...
        }
//
///1:N账户\活动\各方
/// 
[Microsoft.Xrm.Sdk.RelationshipSchemaNameAttribute(“帐户\活动\当事人”)]
公共系统.Collections.Generic.IEnumerable帐户\u活动\u参与方
{
得到
{
返回此.GetRelatedEntities(“帐户\活动\各方”,null);
}
...
}
此代码应在所有情况下正常工作。当然,可能存在一些安全问题。您的代码在某些CRM用户凭据下执行,您应该确保该用户有足够的权限浏览这两个实体。

但您应该注意的最重要的事情是,如何检索实例
myAccount
。您提到此代码在插件内部使用。但是您没有提到它是什么类型的插件(前阶段、后阶段),在这个插件中处理什么类型的消息,如何检索实体的实例
myAccount
。如果直接调用检索方法,则应填充所有属性。但如果
myAccount
来自输入参数,则无法保证所有属性的所有实际值都将被设置。这可能是集合为空的原因。

啊-需要显式加载集合:

orgContext.LoadProperty(account, "new_BookingAccount_new_ExternalCode");
foreach (new_BookingAccount ba in myAccount.new_Account_new_BookingAccount)
{
    ...
}
(虽然如果账户是新实体,则无法执行此操作,因此需要事先进行某种检查):


对于简单的收集迭代来说,似乎有很多工作要做

太好了,谢谢你的建议。这是一个后期插件,我从后期图像中获取实体。用户设置/更改的任何内容都是可用的(当然,我更改了它,保存了它,然后运行了插件)-仍然是空的!我们还没有在我们的系统上设置安全性,所以不要这么认为。再次感谢你的帮助
if (account.CreatedOn == null)
    return;