3

Ich benutze CRM 2016 Web API mit fetchxml Abfrage Parameter, aber meine Abfrage ist zu lang es simulieren die IN-Operator waren die Anzahl der Parameter in der IN-Liste sind 300 Elemente und einige Zeiten werden mehr sein.Anfrage URL zu lang für fetchXml Abfragetypen

Also mein Problem ist die Abfrage sind zu groß für eine GET HTTP-Anfrage. Ich habe versucht, die Abfrage in der HTTP-Nachricht senden, aber das hat nicht funktioniert, was ist die Lösung für dieses Problem?

Hier ist ein Code-Snippet der FetchXML Abfrage, die ich verwendet:

<fetch mapping="logical" distinct="true"> 
    <entity name="entity"> 
     <attribute name="new_classopportunityid" /> 
     <attribute name="new_trainingproduct" /> 
     <attribute name="new_gtgstatus" /> 
     <attribute name="new_scheduledstartdate" /> 
     <attribute name="new_scheduledenddate" /> 
     <attribute name="new_remainingnumberofseats" /> 
     <attribute name="new_liveclassroom" /> 
     <attribute name="new_maxlive" /> 
     <attribute name="new_xavieruniversity" /> 
     <attribute name="new_partnerlive" /> 
     <attribute name="new_blended" /> 
     <filter> 
     <condition attribute="new_classopportunityid" operator="in"> 
      <value>001943ea-e263-e611-8158-00155d002810</value> 
      <value>0071e4ea-bd9b-e611-8163-00155d002810</value> 
      <value>00c32774-1c8f-e611-8161-00155d002810</value> 
      <value>00d513fa-f0bb-e611-8169-00155d002810</value> 
      <value>....</value> 
      <value>....</value> 
      <value>....</value> 
     </condition> 
     </filter> 
    </entity> 
</fetch> 

Die CRM Web api Endpunkt, ich ersuche ist:

GET http://<org>/api/data/v8.0/<entity>?fetchXml=<fetch mapping="logical" distinct="true"> 
     <entity name="entity"> 
      <attribute name="new_classopportunityid" /> 
      <attribute name="new_trainingproduct" /> 
      <attribute name="new_gtgstatus" /> 
      <attribute name="new_scheduledstartdate" /> 
      <attribute name="new_scheduledenddate" /> 
      <attribute name="new_remainingnumberofseats" /> 
      <attribute name="new_liveclassroom" /> 
      <attribute name="new_maxlive" /> 
      <attribute name="new_xavieruniversity" /> 
      <attribute name="new_partnerlive" /> 
      <attribute name="new_blended" /> 
      <filter> 
      <condition attribute="new_classopportunityid" operator="in"> 
       <value>001943ea-e263-e611-8158-00155d002810</value> 
       <value>0071e4ea-bd9b-e611-8163-00155d002810</value> 
       <value>00c32774-1c8f-e611-8161-00155d002810</value> 
       <value>00d513fa-f0bb-e611-8169-00155d002810</value> 
       <value>....</value> 
       <value>....</value> 
       <value>....</value> 
      </condition> 
      </filter> 
     </entity> 
    </fetch> 

Dies ist die Antwort, die ich von der api bekam.

Error code: 414: HTTP/1.1 414 Request-URI Too Long Response : "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01\/\/EN\"\"http:\/\/www.w3.org\/TR\/html4\/strict.dtd\">\r\n<HTML><HEAD><TITLE>Request URL Too Long<\/TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text\/html; charset=us-ascii\"><\/HEAD>\r\n<BODY><h2>Request URL Too Long<\/h2>\r\n<hr><p>HTTP Error 414. The request URL is too long.<\/p>\r\n<\/BODY><\/HTML>\r\n" [] [] 

Antwort

3

Sie erhalten einen Beitrag verwenden müssen, nicht ein Get:

https://dreamingincrm.com/2017/01/15/executing-large-fetchxml-with-webapi/

+0

Ich habe versucht, Post auf dem Entitätsendpunkt zu verwenden, aber dies ist ein REST und das bedeutet, dass Entität keine Entität erhalten, ich werde die URL überprüfen, die Sie gesendet haben. Danke –

+0

Ja! Ich habe das gestern auch schon gesehen und wollte es als Follow-up meiner Antwort posten. Guter Fund. –

+0

Danke Mann, dein Code rettet mein Leben –

1

den „in“ Operator mit einer großen Liste von IDs ist wahrscheinlich nicht der beste Weg, um abzufragen, wie Sie gesehen haben. Es wäre besser, wenn Sie auf ein Attribut des new_classopportunity Einheit unter Verwendung eines link-entity, wie diese Filter könnte:

<fetch mapping="logical" distinct="true" > 
    <entity name="entity" > 
    <!-- ... all your attributes ... --> 
    <link-entity name="new_classopportunity" from="new_classopportunityid" to="new_classopportunityid" > 
     <attribute name="new_name" /> 
     <filter> 
     <condition attribute="statecode" operator="eq" value="0" /> 
     </filter> 
    </link-entity> 
    </entity> 
</fetch> 

Hinweis Sie in Attribute aus dem link-entity auch ziehen können. In diesem Fall ziehe ich den Namen ein und verwende einen Filter, um nur new_classopportunity Datensätze zu erhalten, die aktiv sind.

Wenn Sie kein Feld auf new_classopportunity haben, auf das Sie filtern können, um die gleiche Liste zu erhalten, fügen Sie eins hinzu! :)

+0

Ich weiß nicht, was die Link-Einheit ist, aber es scheint, dass Sie schlagen vor, eine Reihe Abfrage zu verwenden (dh zwischen x1 und x2 aber x1, und x2 ist nicht Integer sie sind GUID-Zeichenfolge). –

+0

Es ähnelt einem INNER JOIN in SQL. Sie ziehen alle Ihre Hauptstitätsdatensätze ein und verknüpfen sie mit der zugehörigen Entität. Sie können diese Link-Entität filtern, sodass das Endergebnis eine Liste Ihrer Hauptstitätsdatensätze mit übereinstimmenden new_classopportunity-Datensätzen ist. Auf diese Weise übergeben Sie keine große Liste von IDs - Sie übergeben einen Filter, der dieselben IDs in der Entitätsverknüpfung zurückgibt. –

+0

Leider kann ich die lange Liste der IDs nicht loswerden. –