Microsoft Dynamics CRM - 电子邮件实体检索数据 - 插件

Noo*_*oyi 0 c# plugins dynamics-crm dynamics-crm-online dynamics-crm-2016

我正在尝试为Microsoft Dynamics CRM Online中的电子邮件实体编写插件.让我们说它叫做"Sample_PlugIn".

我希望插件检索电子邮件的发件人,并将他/她的电子邮件地址写入电子邮件的字段(new_samplefield).

插件也做了一些其他的事情(并且它都在工作),但这部分代码是制造问题的部分.(我的组织服务参考称为"服务".)

try                
{               
    Entity email = (Entity)context.InputParameters["Target"];

    EntityCollection fromCollection = (EntityCollection)email.Attributes["from"];

    if (fromCollection != null && fromCollection.Entities.Count > 0)
    {
        Entity sender = fromCollection[0]; 
        email["new_samplefield"] = (string)sender.Attributes["internalemailaddress"];
    }

    service.Update(email);
}
Run Code Online (Sandbox Code Playgroud)

每次执行插件时,都会收到此错误:

插件的意外异常(Execute):Sample_PlugIn.Sample_PlugIn:System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键.

如果有人能帮助我会很棒 - 非常感谢!

Fed*_*set 5

为了解决问题,您需要了解partylist字段的工作方式以及Activity Party实体在此方面的作用.

基本上,"from"字段(它也适用于电子邮件活动中的to,cc和cco字段)可以包含具有不同实体类型的多个实体引用.然后,Activity Party实体是一个"包装器",允许您将所有这些不同的实体类型作为一个处理.您可以轻松检查此检查fromCollection对象:

在此输入图像描述

如果你更进一步检查该实体的属性,你会发现属性不是你期望的属性,现在很明显产生了错误,因为这个实体中不存在internalemailaddress属性(实际上,此属性仅存在于systemuser实体中,因此您的插件未考虑帐户/联系人/等也可能是发件人).

在partylist的属性中,您将找到两个可能有用的属性.该partyid是实际的EntityReference到被引用,这样你就可以使用这个检索记录,并获得所需的场纪录(systemuser /联系人/帐号/等).如果您只需要emailaddress,则可以使用addressused属性,如以下示例所示:

        Entity email = (Entity)context.InputParameters["Target"];

        EntityCollection fromCollection = (EntityCollection)email.Attributes["from"];

        if (fromCollection != null && fromCollection.Entities.Count > 0)
        {
            Entity sender = fromCollection[0];
            string emailAddress = (string)sender.Attributes["addressused"];
        }
Run Code Online (Sandbox Code Playgroud)