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");
    }