繁体   English   中英

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

[英]Microsoft Dynamics CRM - Email Entity Retrieve Data - Plug In

我正在尝试为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);
}

每次执行插件时,都会出现此错误:

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

如果有人可以帮助我,那就太好了-非常感谢!

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

基本上,“发件人”字段(也适用于电子邮件活动中的“收件人”,“抄送”和“ cco”字段)可以保存具有不同实体类型的多个实体引用。 然后,活动方实体是一个“包装器”,它使您可以将所有这些不同的实体类型作为一个实体来处理。 您可以通过检查fromCollection对象轻松地检查此内容

在此处输入图片说明

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

在参与方列表的属性中,您会发现两个有用的属性。 partyid是对所引用记录(systemuser / contact / account / etc。 )的实际EntityReference,因此您可以使用它来检索记录并获取必填字段。 如果仅需要电子邮件地址 ,则可以使用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"];
        }

为了完整起见,这是最终为我工作的代码。 在这种情况下,发送者是实体systemuser。 (我已经在“后期操作”和“更新”上注册了此插件。)

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

    //  Post Entity Image (since the plug-in is registered on "Update")
    Entity postImage = context.PostEntityImages["Image"];

    EntityCollection fromCollection = postImage.GetAttributeValue<EntityCollection>("from");

    if (fromCollection != null && fromCollection.Entities.Count > 0)
    {
        Entity sender = fromCollection[0];
        EntityReference partyId = sender.GetAttributeValue<EntityReference>("partyid");

        string entityType = partyId.LogicalName.ToString();

        if (entityType == "systemuser")
            {
                //  Create query using querybyattribute
                QueryByAttribute queryToSender = new QueryByAttribute("systemuser");
                queryToSender.ColumnSet = new ColumnSet("systemuserid", "internalemailaddress");

                //  Attribute to query
                queryToSender.Attributes.AddRange("systemuserid");

                //  Value of queried attribute to return
                queryToSender.Values.AddRange(partyId.Id);

                EntityCollection retrievedFromSystemuser = service.RetrieveMultiple(queryToSender);

                foreach (Entity systemuserE in retrievedFromSystemuser.Entities)
                    {
                        email["new_samplefield"] = (string)systemuserE.Attributes["internalemailaddress"];                          
                    }
            }                     
        }

    service.Update(email);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM