Plugins 如何从表中获取不同的记录并将其删除
我正在开发一个插件上的删除按钮,当我删除任何选定的记录时,所有不同的(选定的记录)也应该被删除 在我的情况下,我有一位与会者被邀请参加会议,该与会者也有一些讨论点记录和行动项目记录,根据我删除会议与会者时的要求,如果该与会者有任何讨论点记录和行动项目记录,则应删除该与会者。需要这方面的帮助 下面是我的代码:Plugins 如何从表中获取不同的记录并将其删除,plugins,dynamics-crm-2011,dynamics-crm,distinct,Plugins,Dynamics Crm 2011,Dynamics Crm,Distinct,我正在开发一个插件上的删除按钮,当我删除任何选定的记录时,所有不同的(选定的记录)也应该被删除 在我的情况下,我有一位与会者被邀请参加会议,该与会者也有一些讨论点记录和行动项目记录,根据我删除会议与会者时的要求,如果该与会者有任何讨论点记录和行动项目记录,则应删除该与会者。需要这方面的帮助 下面是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Messages;
namespace SFDSendEmail.SFDDeleteAttendee.Class
{
public class SFDDeleteAttendee : IPlugin
{
Guid Internaluser;
Guid Externaluser;
private IOrganizationService _sdk = null;
public void Execute(IServiceProvider serviceProvider)
{
try
{
// Obtain the execution context from the service provider.
IPluginExecutionContext context = (IPluginExecutionContext)
serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_sdk = (IOrganizationService)factory.CreateOrganizationService(context.UserId);
if (context.IsExecutingOffline || context.IsOfflinePlayback)
return;
// The InputParameters collection contains all the data passed
// in the message request.
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is EntityReference)
{
// EntityReference RequiredAttendee = context.InputParameters["new_requiredattendee"] as EntityReference;
// Entity entity = _sdk.Retrieve("new_requiredattendee", ((EntityReference)RequiredAttendee["new_requiredattendeeid"]).Id, new ColumnSet(true));
// Entity eUser = _sdk.Retrieve(RequiredAttendee.LogicalName, RequiredAttendee.Id, new ColumnSet(true));
EntityReference RequiredAttendee = (EntityReference)context.InputParameters["Target"];
Entity eUser = _sdk.Retrieve(RequiredAttendee.LogicalName, RequiredAttendee.Id, new ColumnSet(true));
if (context.MessageName == "Delete")
{
if (eUser.LogicalName != "new_requiredattendee")
{
return;
}
else
{
//If User Selects the Interner User for Deletion
if (eUser.Attributes.Contains("new_internaluser"))
{
//Save Internal User ID
Internaluser = ((EntityReference)eUser["new_internaluser"]).Id;
//Function to fetch the Meeting Attendee with the Above ID
Guid VerifyAttendee = VerifyMeetingAttendee(eUser,_sdk,Internaluser);
//If its the Meeting Attendee
if (VerifyAttendee != null)
{
//Get the Attendee with its Discussion Point
Guid AttendeewithDp = VerifyDPMeetingAttendee(eUser, _sdk, Internaluser);
if (AttendeewithDp != null)
{
//Get the Attendee with Action item
Guid AttendeewithAI = VerifyAIMeetingAttendee(eUser, _sdk, Internaluser);
if (AttendeewithAI != null)
{
//DO your code here....................................
_sdk.Delete("new_requiredattendee", AttendeewithAI);
}
}
}
}
//If User Selects the Interner User for Deletion
else if (eUser.Attributes.Contains("new_externaluser"))
{
//Save Internal User ID
Externaluser = ((EntityReference)eUser.Attributes["new_externaluser"]).Id;
//Function to fetch the Meeting Attendee with the Above ID
Guid verifyExternalAttendee = VerifyExternalMeetingAttendee(eUser,_sdk,Externaluser);
if (verifyExternalAttendee != null)
{
//Get the Attendee with its Discussion Point
Guid EXAttendeewithDp = VerifyEXDPMeetingAttendee(eUser, _sdk, Externaluser);
if (EXAttendeewithDp != null)
{
//Get the Attendee with Action item
Guid EXAttendeewithAI = VerifyEXAIMeetingAttendee(eUser, _sdk, Externaluser);
if (EXAttendeewithAI != null)
{
//DO your code here....................................
_sdk.Delete("new_requiredattendee", EXAttendeewithAI);
}
}
}
}
}
}
}
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex);
}
}
//Get Internal Meeting Attendee
public Guid VerifyMeetingAttendee(Entity RequiredAttendee,IOrganizationService _orgService,Guid user)
{
QueryExpression GetMeetingAttendees = new QueryExpression();
GetMeetingAttendees.EntityName = "new_requiredattendee";
GetMeetingAttendees.ColumnSet = new ColumnSet("new_internaluser");
GetMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Equal,user);
GetMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.Null);
GetMeetingAttendees.Criteria.AddCondition("new_discussionpoint", ConditionOperator.Null);
GetMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetMeetingAttendees);
return (Guid)GMA[0]["new_internaluser"];
}
//Get Internal Meeting Attendee with Discussion Point
public Guid VerifyDPMeetingAttendee(Entity RequiredAttendee, IOrganizationService _orgService, Guid user)
{
QueryExpression GetDPMeetingAttendees = new QueryExpression();
GetDPMeetingAttendees.EntityName = "new_requiredattendee";
GetDPMeetingAttendees.ColumnSet = new ColumnSet("new_internaluser");
GetDPMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetDPMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Equal,user);
GetDPMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.Null);
GetDPMeetingAttendees.Criteria.AddCondition("new_discussionpoint", ConditionOperator.NotNull);
GetDPMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetDPMeetingAttendees);
return (Guid)GMA[0]["new_internaluser"];
}
//Get Internal Meeting Attendee with Action Items
public Guid VerifyAIMeetingAttendee(Entity RequiredAttendee, IOrganizationService _orgService, Guid user)
{
QueryExpression GetDPMeetingAttendees = new QueryExpression();
GetDPMeetingAttendees.EntityName = "new_requiredattendee";
GetDPMeetingAttendees.ColumnSet = new ColumnSet("new_internaluser");
GetDPMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetDPMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Equal,user);
GetDPMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.NotNull);
GetDPMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetDPMeetingAttendees);
return (Guid)GMA[0]["new_internaluser"];
}
//Get External Meeting Attendee
public Guid VerifyExternalMeetingAttendee(Entity RequiredAttendee, IOrganizationService _orgService, Guid user)
{
QueryExpression GetMeetingAttendees = new QueryExpression();
GetMeetingAttendees.EntityName = "new_requiredattendee";
GetMeetingAttendees.ColumnSet = new ColumnSet("new_externaluser");
GetMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Equal, user);
GetMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.Null);
GetMeetingAttendees.Criteria.AddCondition("new_discussionpoint", ConditionOperator.Null);
GetMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetMeetingAttendees);
return (Guid)GMA[0]["new_externaluser"];
}
//Get External Meeting Attendee with Discussion Point
public Guid VerifyEXDPMeetingAttendee(Entity RequiredAttendee, IOrganizationService _orgService, Guid user)
{
QueryExpression GetMeetingAttendees = new QueryExpression();
GetMeetingAttendees.EntityName = "new_requiredattendee";
GetMeetingAttendees.ColumnSet = new ColumnSet("new_externaluser");
GetMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Equal, user);
GetMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.Null);
GetMeetingAttendees.Criteria.AddCondition("new_discussionpoint", ConditionOperator.NotNull);
GetMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetMeetingAttendees);
return (Guid)GMA[0]["new_externaluser"];
}
//Get External Meeting Attendee with Action Item
public Guid VerifyEXAIMeetingAttendee(Entity RequiredAttendee, IOrganizationService _orgService, Guid user)
{
QueryExpression GetMeetingAttendees = new QueryExpression();
GetMeetingAttendees.EntityName = "new_requiredattendee";
GetMeetingAttendees.ColumnSet = new ColumnSet("new_externaluser");
GetMeetingAttendees.Criteria.AddCondition("new_mom", ConditionOperator.Equal, RequiredAttendee["new_mom"]);
GetMeetingAttendees.Criteria.AddCondition("new_externaluser", ConditionOperator.Equal, user);
GetMeetingAttendees.Criteria.AddCondition("new_actionitem", ConditionOperator.NotNull);
GetMeetingAttendees.Criteria.AddCondition("new_internaluser", ConditionOperator.Null);
EntityCollection GMA = _orgService.RetrieveMultiple(GetMeetingAttendees);
return (Guid)GMA[0]["new_externaluser"];
}
}
}
我在理解这个问题上有点困难,但以下是我的想法 1) 如果它正在回滚删除操作,则该删除操作或下面的级联删除操作都会出错。提供异常消息将大大有助于我们解决您的问题 2) 您可以使用LINQ查询而不是CRM QueryExpression使代码更加简洁易读。另一个需要改进的地方是使用1个小调整多次完全相同的代码-也就是attributes.contains(“new_internaluser”)和attributes.contains(“new_external”)的分支-可以大大改进(见下文)
这段代码是否抛出了某种错误?或者它只是没有按预期工作?我无法删除记录,在代码点击sdk后。删除其回滚。我不确定,但可能有一个提示干扰了代码。
//Add this method to the class
internal void deleteUser(string userString){
user = ((EntityReference)eUser[userString]).Id;
//Function to fetch the Meeting Attendee with the Above ID
Guid VerifyAttendee = VerifyMeetingAttendee(eUser,_sdk,user);
//If its the Meeting Attendee
if (VerifyAttendee != null)
{
//Get the Attendee with its Discussion Point
Guid AttendeewithDp = VerifyDPMeetingAttendee(eUser, _sdk, user);
if (AttendeewithDp != null)
{
//Get the Attendee with Action item
Guid AttendeewithAI = VerifyAIMeetingAttendee(eUser, _sdk, user);
if (AttendeewithAI != null)
{
//DO your code here....................................
_sdk.Delete("new_requiredattendee", AttendeewithAI);
}
}
}
}
//And call it with these few simple lines within your main execute method:
if (eUser.Attributes.Contains("new_internaluser"))
{
deleteUser("new_internaluser");
}
//If User Selects the Interner User for Deletion
else if (eUser.Attributes.Contains("new_externaluser"))
{
deleteUser("new_externaluser");
}