2014-02-28 31 views
2

在CRM中,我試圖自動執行從鏈中以前電子郵件創建新電子郵件的過程。該電子郵件必須發送給該案例的客戶,該案例可以是accountcontact如何在Microsoft CRM中從Guid中查找客戶實體邏輯名稱

我可以檢索聯繫人/帳戶的Guid,但我不知道如何檢索邏輯名稱。

這是我到目前爲止有:

OrganizationServiceProxy service = CRMCentralCRMServiceInstance; 

Guid customerId = GetCustomerIdFromCase(caseId); 

Entity email = new Entity("email"); 

Entity activityPartyTo = new Entity("activityparty"); 

//"account" is a guess, it could be "contact" 
EntityReference customerReferenceTo = new EntityReference("account", customerId); 

activityPartyTo["partyid"] = customerReferenceTo; 
EntityCollection toEntityCollection = new EntityCollection(); 
toEntityCollection.Entities.Add(activityPartyTo); 
email["to"] = toEntityCollection; 
. 
. 
. 
newEmailId = service.Create(email); 



public Guid GetCustomerIdFromCase(Guid caseId) { 
    Guid customerId = Guid.Empty; 
    List<CRMCase> caseList = GetCRMCasesById(caseId); 

    if (caseList.Count > 0) 
    { 
     CRMCase cmcCase = caseList.First(); 
     customerId = cmcCase.CustomerId; 
    } 

    return (customerId); 
} 

public List<CRMCase> GetCRMCasesById(Guid caseId) 
    { 
     List<CRMCase> crmCases = new List<CRMCase>(); 

     try 
     { 
      OrganizationServiceProxy service = CRMCentralCRMServiceInstance; 

      ConditionExpression condition1 = new ConditionExpression(); 
      ConditionExpression condition2 = new ConditionExpression(); 

      condition1.AttributeName = "incidentid"; 
      condition1.Operator = ConditionOperator.Equal; 
      condition1.Values.Add(caseId.ToString("N")); 

      condition2.AttributeName = "statecode"; 
      condition2.Operator = ConditionOperator.In; 
      condition2.Values.Add("Active"); 
      condition2.Values.Add("Resolved"); 

      FilterExpression filter = new FilterExpression(); 

      filter.FilterOperator = LogicalOperator.And; 
      filter.Conditions.Add(condition1); 
      filter.Conditions.Add(condition2); 

      QueryExpression query = new QueryExpression(); 

      query.EntityName = "incident"; 
      query.ColumnSet = new ColumnSet(true); 
      query.Criteria = filter; 


      RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest(); 
      retrieveAttributeRequest.EntityLogicalName = "incident"; 
      retrieveAttributeRequest.LogicalName = "statuscode"; 
      retrieveAttributeRequest.RetrieveAsIfPublished = true; 

      RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); 
      StatusAttributeMetadata statusCodeAttribute = (StatusAttributeMetadata)retrieveAttributeResponse.AttributeMetadata; 


      retrieveAttributeRequest = new RetrieveAttributeRequest(); 
      retrieveAttributeRequest.EntityLogicalName = "incident"; 
      retrieveAttributeRequest.LogicalName = "prioritycode"; 
      retrieveAttributeRequest.RetrieveAsIfPublished = true; 

      retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); 
      PicklistAttributeMetadata priorityCodeAttribute = (PicklistAttributeMetadata)retrieveAttributeResponse.AttributeMetadata; 


      retrieveAttributeRequest = new RetrieveAttributeRequest(); 
      retrieveAttributeRequest.EntityLogicalName = "incident"; 
      retrieveAttributeRequest.LogicalName = "statecode"; 
      retrieveAttributeRequest.RetrieveAsIfPublished = true; 

      retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest); 
      StateAttributeMetadata stateCodeAttribute = (StateAttributeMetadata)retrieveAttributeResponse.AttributeMetadata; 


      EntityCollection casesColl = service.RetrieveMultiple(query); 

      foreach (Entity entity in casesColl.Entities) 
      { 
       Entity incidentCRMCase = entity; 
       CRMCase cRMCase = GetCRMCaseFromIncidentCase(incidentCRMCase, statusCodeAttribute.OptionSet.Options, stateCodeAttribute.OptionSet.Options, priorityCodeAttribute.OptionSet.Options); 
       crmCases.Add(cRMCase); 
      } 
     } 
     catch (SoapException se) 
     { 
      string action = MethodBase.GetCurrentMethod().DeclaringType.Name + " :: " + MethodBase.GetCurrentMethod().Name; 
      string message = "Unexpected error in action: " + action 
           + Environment.NewLine + se.Message 
           + Environment.NewLine + se.Detail.InnerText; 

      throw new Exception(message); 
     } 

     return (crmCases); 
    } 

我發現this蠻力方法,但我寧願找一個更清潔的方式,如果有。

+0

請問您可以添加GetCustomerIdFromCase方法到您的問題。我可以幫助你解決它返回EntityReference而不是Guid。 –

+0

@AndriiButenko編輯 – stackErr

回答

3

好的。真的很複雜的代碼。嘗試使用類似如下的東西:

private EntityReference GetCustomerFromCase(Guid caseId) 
{ 
    Entity Case = CRMCentralCRMServiceInstance.Retrieve("incident", caseId, new ColumnSet("customerid")); 
    return Case.GetAttributeValue<EntityReference>("customerid"); 
} 
+0

完美!正是我需要的 – stackErr

相關問題