【发布时间】:2017-06-06 10:53:56
【问题描述】:
如何通过插件从 CRM 2011 中的电子邮件抄送字段中删除活动方?
到目前为止我已经完成了,但我被困在了这个之外。我的问题是电子邮件路由器在抄送字段中使用相同的电子邮件地址复制联系人。我们建议对联系人进行重复数据删除是最佳解决方案,但该解决方案尚未被接受。因此,目前,我们需要能够从电子邮件抄送字段中删除活动方,并将其替换为未解析的电子邮件地址。
有什么想法吗?
Email email = crmService.Retrieve(Email.EntityLogicalName, emailId, new Microsoft.Xrm.Sdk.Query.ColumnSet(true)).ToEntity<Email>(); //Do not use ColumnSet(true)
List<ActivityParty> ccPartyList = email.Cc.ToList<ActivityParty>();
List<string> ccEmailAddresses = new List<string>();
foreach (ActivityParty ap in ccPartyList)
{
ccEmailAddresses.Add(ap.AddressUsed);
}
List<string> dedupedCCEmailAddresses = ccEmailAddresses.Distinct().ToList();
List<string> emailAddressToBeRemoved = new List<string>();
//Check for each unique email addresses, how many records are there
foreach (string emailAddress in dedupedCCEmailAddresses)
{
int count = ccPartyList.Count(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
if (count > 1) //Same email address; Multiple Records
{
emailAddressToBeRemoved.Add(emailAddress);
}
}
//Remove ALL Activity Party from the List
foreach (string emailAddress in emailAddressToBeRemoved)
{
ccPartyList.RemoveAll(ap => ap.AddressUsed.Equals(emailAddress, StringComparison.InvariantCultureIgnoreCase));
ActivityParty unResolvedEmailAddress = new ActivityParty();
unResolvedEmailAddress.AddressUsed = emailAddress;
ccPartyList.Add(unResolvedEmailAddress);
}
Email emailToUpdate = new Email();
emailToUpdate.Id = emailId;
emailToUpdate.Cc = ccPartyList;
crmService.Update(emailToUpdate);
我现在使用以下代码对其进行了更新,其中我删除了所有 CC 方。
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService service = localContext.OrganizationService;
tracingService = localContext.TracingService;
Email emailFromTarget = (context.InputParameters.Contains("Target")
&& context.InputParameters["Target"] is Entity)
?
((Entity)context.InputParameters["Target"]).ToEntity<Email>() : null;
Entity email = service.Retrieve(Email.EntityLogicalName, emailFromTarget.Id, new ColumnSet("cc"));
EntityCollection cc = email.GetAttributeValue<EntityCollection>("cc");
if (cc != null)
{
cc.Entities.ToList().ForEach(party =>
{
cc.Entities.Remove(party);
});
}
email["cc"] = cc;
service.Update(email);
即使如此,CC 字段也会继续保留数据发布创建。
我在 Post Create Plugin 中执行此操作。这样是不是不删除它们?我必须将其作为工作流/CWA 进行吗?
【问题讨论】:
-
为什么发布创建?有没有试过预操作?
-
@ArunVinoth 是的,我确实是在操作前完成的。稍后我会发布完整的代码。
-
@ArunVinoth 你能把这个写成答案,这样我就可以把它标记为接受了吗?
标签: c# plugins dynamics-crm dynamics-crm-2011 microsoft-dynamics