c# - 如何从 Microsoft CRM 中的 Guid 查找客户实体逻辑名称

标签 c# .net dynamics-crm

在 CRM 中,我试图自动化从链中的先前电子邮件创建新电子邮件的过程。此电子邮件必须发送给案例的客户,该客户可以是帐户联系人

我可以检索联系人/帐户的 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蛮力方法,但我宁愿找到一种更干净的方法(如果有的话)。

最佳答案

好的。代码确实很复杂。尝试使用如下所示的内容:

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

关于c# - 如何从 Microsoft CRM 中的 Guid 查找客户实体逻辑名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100128/

相关文章:

.net - 暗影 "Error Parsing XSLT File"

.net - 自定义 MVVM 实现 Vs。 Prism

javascript - CRM 2011 - 使用 JavaScript 保存时进行重复检测

c# - 在 Dynamics CRM 2011 中将发票标记为已付款

c# - 如何将 IsEnabled 或 IsVisible 属性绑定(bind)到方法或属性获取?

c# - ASP.Net MVC Helper LabelExtension 未按预期显示

c# - ASP.NET MVC - 如何检测用户是否正在使用屏幕阅读器

c# - 如何删除多对括号之间的文本?

c# - 应该扩展还是封装 ORM 对象?

reporting-services - 如何获取运行报告的用户的身份?