2014-10-17 37 views
0

我正在處理刪除按鈕上的插件,當我刪除任何選定的記錄時,也應該刪除所有不同的(選定的記錄)。如何從表中刪除不同的記錄並將其刪除

在我的情況下,我有一個參加會議的參加者,參加者也有一些討論點記錄和動作項目記錄,根據我要刪除我的會議參加者的要求,應刪除此參加者它有任何討論點記錄和行動項目記錄。需要這方面的幫助。

下面是我的代碼:

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"]; 

     } 
    } 
} 
+0

這段代碼是否會拋出某種錯誤?還是它沒有按預期工作? – 2014-10-17 21:38:47

+0

我無法刪除記錄,代碼命中後,sdk.delete其回滾。我不確定,但可能會有一個令人不安的提示。 – 2014-10-18 16:02:38

回答

0

我有一個小麻煩這裏瞭解這個問題,但這裏是我的想法。

1)如果正在回滾刪除,那麼在刪除或刪除這個下面的級聯刪除時出現錯誤。提供例外消息對幫助我們解決您的問題將有很長的路要走。

2)您可以使用LINQ查詢而不是CRM QueryExpression使代碼更加簡潔和易讀。另一個需要改進的地方是多次調用完全相同的代碼,並進行一次小小的調整 - 也就是attributes.contains(「new_internaluser」)和attributes.contains(「new_external」)用戶的分支可以大大改進 - 見下文)。

//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"); 
    } 
相關問題