使用类型参数的RetrieveMultiple不起作用

时间:2017-11-23 15:14:48

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

出于某种原因,以下功能有效:

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处是“错误”。元素   &#39; http://schemas.microsoft.com/2003/10/Serialization/Arrays:anyType&#39;   包含映射到名称&#39; System:String []&#39;的类型的数据。该   反序列化器不知道映射到此名称的任何类型。   考虑更改您的ResolveName方法的实现   DataContractResolver返回name&#39; String []&#39;的非空值。   和命名空间&#39; System&#39;。&#39;。有关详细信息,请参阅InnerException。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

目前还不清楚你要通过使方法通用来实现什么。你仍然将一串字符串传递给你的T[]

由于您正在返回EntityCollection,您可以使用第一个版本向任何实体查询一组GUID,只需传递不同的实体逻辑名称和id字段。

如果你想使用代理类的早期绑定,你可以做这样的事情(请注意这是未经测试的代码):

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"});