代码之家  ›  专栏  ›  技术社区  ›  OfirD

使用类型参数RetrieveMultiple不起作用

  •  1
  • OfirD  · 技术社区  · 7 年前

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

    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[]”返回非空值 和命名空间“System”。有关更多详细信息,请参阅InnerException。

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Henk van Boeijen    7 年前

    在里面 query.Criteria.AddCondition(idFieldName, ConditionOperator.In, guids); 论点 guids 不能是泛型类型。这只是一个序列化问题。要确保安全,请仅使用类型为的数组 string object 应允许在 ConditionExpression .

        2
  •  1
  •   Aron    7 年前

    目前尚不清楚通过使该方法泛化,您试图实现什么。您仍在将字符串数组传递到 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"});