【问题标题】:RetrieveMultiple using type parameter doesn't work使用类型参数的 RetrieveMultiple 不起作用
【发布时间】:2017-11-23 15:14:47
【问题描述】:

由于某种原因,以下功能起作用:

public EntityCollection RetrieveMultipleByIds(IOrganizationService service, string entityLogicalName, string[] columnSet, string idFieldName, string[] guids)
{
    QueryExpression query = new QueryExpression(entityLogicalName);
    query.ColumnSet = new ColumnSet(columnSet);
    query.Criteria = new FilterExpression();
    query.Criteria.AddCondition(idFieldName, ConditionOperator.In, guids);
    EntityCollection entityCollection = service.RetrieveMultiple(query);
    return entityCollection;
}

但是这个 - 使用类型参数 - 不起作用:

public EntityCollection RetrieveMultipleByIds<T>(IOrganizationService service, string entityLogicalName, string[] columnSet, string idFieldName, T[] guids)
{
     QueryExpression query = new QueryExpression(entityLogicalName);
     query.ColumnSet = new ColumnSet(columnSet);
     query.Criteria = new FilterExpression();
     query.Criteria.AddCondition(idFieldName, ConditionOperator.In, guids);
     EntityCollection entityCollection = service.RetrieveMultiple(query);
     return entityCollection;
}

两者的调用方式相同(请注意,文字字符串 guid 仅用于此示例,您可以确保我传递的 id 存在):

EntityCollection entityCollection =  
RetrieveMultipleByIds("org_session", new string[] { "org_sessionname" }, "org_sessionid", new string[] {"73A5794E-1662-E711-80FF-005056B74623"});

而抛出的异常是:

格式化程序在尝试反序列化 消息:尝试反序列化参数时出错 http://schemas.microsoft.com/xrm/2011/Contracts/Services:query。这 InnerException 消息是“第 1 行位置 2826 中的错误。元素 'http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType' 包含来自映射到名称“System:String[]”的类型的数据。这 反序列化器不知道映射到此名称的任何类型。 考虑更改您的 ResolveName 方法的实现 DataContractResolver 为名称“String []”返回一个非空值 和命名空间“系统”。有关详细信息,请参阅 InnerException。

我知道有类似的问题询问这种异常,但没有一个与使用类型参数有关。如果有人偶然发现了同样的问题并设法找到并解决了问题,我会很高兴听到这个消息。

【问题讨论】:

    标签: c# dynamics-crm dynamics-crm-2015


    【解决方案1】:

    query.Criteria.AddCondition(idFieldName, ConditionOperator.In, guids); 中,参数guids 不能是泛型类型。这只是一个序列化问题。为了安全起见,ConditionExpression 中应该只允许使用 stringobject 类型的数组。

    【讨论】:

      【解决方案2】:

      目前尚不清楚通过使方法泛型来实现什么。您仍在将字符串数组传递给您的T[]

      由于您返回 EntityCollection,因此您可以通过传递不同的实体逻辑名称和 id 字段来查询任何实体以获取具有第一个版本的一组 GUID。

      如果您想使用代理类的早期绑定,您可以执行以下操作(请注意,此代码未经测试):

      public List<T> RetrieveMultipleByIds<T>(IOrganizationService service, string entityLogicalName, string[] columnSet, string idFieldName, string[] guids)
      {
           QueryExpression query = new QueryExpression(entityLogicalName);
           query.ColumnSet = new ColumnSet(columnSet);
           query.Criteria = new FilterExpression();
           query.Criteria.AddCondition(idFieldName, ConditionOperator.In, guids);
           var entityCollection = service.RetrieveMultiple(query);
           return entityCollection.Select(e => e.ToEntity<T>()).ToList();
      }
      

      然后调用它:

      List<Account> accounts = RetrieveMultipleByIds<Account>(svc, "account", new string[] { "name" }, "accountid", new string[] {"73A5794E-1662-E711-80FF-005056B74623"});
      

      【讨论】:

      • 泛型方法可以同时支持stringGuid两种类型
      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2016-09-28
      • 2013-01-03
      • 2014-04-20
      • 2016-08-07
      相关资源
      最近更新 更多