【问题标题】:Microsoft Dynamics CRM - Email Entity Retrieve Data - Plug InMicrosoft Dynamics CRM - 电子邮件实体检索数据 - 插件
【发布时间】:2017-02-21 14:47:17
【问题描述】:

我正在尝试为 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:给定的密钥不是 出现在字典中。

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

【问题讨论】:

    标签: c# plugins dynamics-crm dynamics-crm-online dynamics-crm-2016


    【解决方案1】:

    为了解决此问题,您需要了解partylist 字段的工作原理以及Activity Party entity 在此方面的作用。

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

    如果您进一步检查该实体的属性,您会发现这些属性不是您所期望的,现在很明显错误是由于 internalemailaddress 而生成的strong> 此实体中不存在属性(实际上,此属性仅存在于 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"];
            }
    

    【讨论】:

    • 谢谢,这很有帮助!我不知道存在诸如派对列表之类的东西。但是,由于我需要发件人的电子邮件地址(不是“使用的地址”),实际使它工作有点复杂 - 但你的回答让我走上了正确的道路!为了完整起见,我在下面发布了我的代码。
    【解决方案2】:

    为了完整起见,这是最终对我有用的代码。在这种情况下,发送者是实体 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多