【问题标题】:Do not return duplicates in Dynamics 365 Web API data retrieval query不要在 Dynamics 365 Web API 数据检索查询中返回重复项
【发布时间】:2019-12-28 00:39:14
【问题描述】:

我正在使用以下查询参数通过 Dynamics 365 Web API (PHP) 检索所有活动成员资格记录。

$params = array(
    "$select" => "member_number,statuscode,statecode",
    "$filter" => "statecode eq 1"
);

这将返回所有活动的成员记录(状态码 1)。但是,由于特定成员可能具有即将到期的成员资格和最近更新的成员资格(等等),因此单个实​​体可以返回多个活动记录,从而使我的结果膨胀。我只需要知道一个实体是否处于活动状态,而不是六次。

有没有办法排除重复记录,以便我只收到每个活动会员记录的一个实例?我正在寻找相当于在 SQL 查询中使用 DISTINCT 的 Dynamics 365 Web API。

【问题讨论】:

  • 抱歉耽搁了,感谢您的回答。由于我不熟悉 FetchXML,因此我需要设置一个单独的 Dynamics 测试环境来进行试验。我的目标是在接下来的几天内执行此操作,如果我能使其正常工作,我肯定会接受您的回答。再次感谢!
  • 我建议您在 XrmToolBox FetchXML builder 中使用 fetchxml 查询。
  • 感谢您的提示 :) 我今天会检查一下。
  • 你能解决吗?
  • 不幸的是,我还没有机会尝试这个。临时解决方法是在我的 cURL 请求参数中使用 'startswith(entity, 'value')' 过滤器。这会返回可管理数量的结果,因为我过滤掉了大量不需要的结果。但是,我返回的结果仍然重复。所以,我仍然想留下这个问题并尽快探索你的答案,因为目前的解决方案实际上只是一个临时的解决方案。再次,抱歉耽搁了,感谢您的回答!我想的比你知道的还要多!

标签: php dynamics-crm dynamics-crm-webapi


【解决方案1】:

我不是 php 背景,但我会尝试。

Distinct 只能用于 FetchXML 查询,fetchxml can be used along with web api

我可以找到以下示例 - AlexaCRM toolkit 的在线参考。

$fetchXML = <<<FETCHXML
<fetch mapping="logical" distinct="true"> 
    <entity name="new_membership">
        <attribute name="member_number" /> 
    </entity>
</fetch>
FETCHXML;

$fetchExpression = new \AlexaCRM\Xrm\Query\FetchExpression( $fetchXML );
$collection = $client->RetrieveMultiple( $fetchExpression );

【讨论】:

    【解决方案2】:

    虽然我不记得 WebAPI 有一个 Distinct 运算符 FetchXML does

    而且,您可以通过 API 运行 FetchXML

    例如,没有Distinct

    https://myOrg.crm.dynamics.com/api/data/v9.0/contacts?fetchXml= <fetch mapping='logical'> <entity name='contact'> <attribute name='fullname' /> <filter> <condition attribute='fullname' operator='eq' value='Nick Saban'/> </filter> </entity> </fetch>

    返回:

    { "@odata.context":"https://myOrg.crm.dynamics.com/api/data/v9.0/$metadata#contacts(fullname,contactid)", "value":[ { "@odata.etag":"W/\"175969918\"", "fullname":"NICK SABAN", "contactid":"ca338867-8831-e511-8103-c4346bac6974" }, { "@odata.etag":"W/\"187905023\"", "fullname":"NICK SABAN", "contactid":"fff12a11-ef85-e511-810a-fc15b4281ce0" } ] }

    Distinct:
    https://myOrg.crm.dynamics.com/api/data/v9.0/contacts?fetchXml= <fetch mapping='logical' distinct='true'> <entity name='contact'> <attribute name='fullname' /> <filter> <condition attribute='fullname' operator='eq' value='Nick Saban'/> </filter> </entity> </fetch>

    返回:

    { "@odata.context":"https://myOrg.crm.dynamics.com/api/data/v9.0/$metadata#contacts(fullname)", "value":[ { "fullname":"NICK SABAN" } ] }

    【讨论】:

      【解决方案3】:

      由于 Dynamics 支持 ODATA 4.0,您可以通过这种方式使用 $apply 进行查询:

      $params = array(
          "$apply" => "groupby((member_number))",
          "$filter" => "statecode eq 1"
      );
      

      此查询将返回不同的 JSON,但在您的实体中包含不同的“member_numbers”集合。希望对您有所帮助。

      这个答案来自this question。详情请查看。

      【讨论】:

      • 感谢您的信息!这看起来很有希望,我现在正在测试它。如果/当我找到解决方案时,我会更新。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2022-07-14
      • 2022-11-08
      • 2023-03-12
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多