c# - Entity.Contains(AttributeName) 适用于所有注释字段但不适用于注释文本

标签 c# plugins dynamics-crm-2016

在下面的代码片段中,我正在检索与订单相关的注释。只有当 notetext 确实包含数据时,它才能正常工作。现在,在调试时我发现,在其他情况下它会抛出异常,即 Object reference not set to an instance of an object

我认为下面的代码片段看起来不错,但不确定缺少什么,有解决问题的想法吗?

private void fetchDocument(IOrganizationService service, Guid vOrderId) 
{
    EntityCollection results = null;
    string tempNote = string.Empty;
    string tempFileName = string.Empty;

    ColumnSet cols = new ColumnSet("subject", "filename", "documentbody", "mimetype","notetext");
    QueryExpression query = new QueryExpression {
            EntityName = "annotation" ,
            ColumnSet = cols,
            Criteria = new FilterExpression
            {
                Conditions = {
                new ConditionExpression("objectid",ConditionOperator.Equal,vOrderId)
            }
            }
            };
    results = service.RetrieveMultiple(query);
    Entity defaultRecord = results.Entities.ElementAtOrDefault(0);

    if(defaultRecord.Contains("notetext"))
    {
        tempNote = defaultRecord.GetAttributeValue<string>("notetext");
    }

    if (defaultRecord.Contains("filename"))
    {
        tempFileName = defaultRecord.GetAttributeValue<string>("filename");
    }       
}

最佳答案

你没有防止 defaultrecord 为 null。

results = service.RetrieveMultiple(query);
if (results.Entities == null || !results.Entities.Any()) return;
Entity defaultRecord = results.Entities.ElementAt(0);

将答案扩展到备份 result.Entities == null 检查。

检索多个 EntityCollection 并非万无一失。

EntityCollection 属性:

反编译SDK获取多核:

  protected internal virtual EntityCollection RetrieveMultipleCore(QueryBase query)
    {
      bool? retry = new bool?();
      do
      {
        bool forceClose = false;
        try
        {
          using (new OrganizationServiceContextInitializer(this))
            return this.ServiceChannel.Channel.RetrieveMultiple(query);
        }
        catch (MessageSecurityException ex)
        {
          ..
        }
        finally
        {
          this.CloseChannel(forceClose);
        }
      }
      while (retry.HasValue && retry.Value);
      return (EntityCollection) null;
    }

反编译的 SDK 缓存组织服务上下文检索多个:

public override EntityCollection RetrieveMultiple(QueryBase query)
{
   RetrieveMultipleRequest retrieveMultipleRequest = new      RetrieveMultipleRequest();
   retrieveMultipleRequest.Query = query;
   RetrieveMultipleResponse multipleResponse = this.Execute<RetrieveMultipleResponse>((OrganizationRequest) retrieveMultipleRequest);
   if (multipleResponse == null)
     return (EntityCollection) null;
   else
     return multipleResponse.EntityCollection;
}


public EntityCollection EntityCollection
{
   get
   {
     if (this.Results.Contains("EntityCollection"))
        return (EntityCollection) this.Results["EntityCollection"];
     else
        return (EntityCollection) null;
   }
}

关于c# - Entity.Contains(AttributeName) 适用于所有注释字段但不适用于注释文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39889927/

相关文章:

JavaScript 在生产环境中不起作用

plugins - logstash(2.3.2) gzip 编解码器不工作

c# - 检索发票时检索发票详细信息

c# - MDI 子窗体与 MDI 父窗体控件重叠

c# - 如何编写我的 C++ 函数以便我可以从 C# 调用它?

c# - 2017 年 3 月 1 日的 DateTime.Parse 问题

c# - 建议设计: almost every object in app has loggger

eclipse - Gradle Integration for Eclipse 守护程序启动失败

c# - 微软客户关系管理 : How to enable/disable Systemuser without deprecated SetStateRequest

javascript - 如何在 Dynamics CRM 2016 中禁用基于表单的功能区按钮?