首页 文章

使用类型参数RetrieveMultiple不起作用

提问于
浏览
0

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

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 []的类型的数据” . 反序列化器不知道映射到此名称的任何类型 . 考虑更改DataContractResolver上ResolveName方法的实现,以返回名称'String []'和名称空间'System'的非空值 . ' . 有关更多详细信息,请参阅InnerException .

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

2 回答

  • 2

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

  • 0

    目前还不清楚你要通过使方法通用来完成什么 . 你仍然将一个字符串数组传递给你的 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"});
    

相关问题