Comment extraire plus de 5000 entités de CRM

J’interroge MS Dynamics CRM Online à partir de mon application console:

public EntityCollection GetEntities(ssortingng entityName) { IOrganizationService proxy = ServerConnection.GetOrganizationProxy(); ssortingng request = ssortingng.Format("", entityName); FetchExpression expression = new FetchExpression(request); var mult = proxy.ResortingeveMultiple(expression); return mult; } 

Ce code ne renvoie qu’un maximum de 5000 éléments dans plusieurs mult.Entities . Je sais qu’il y a plus d’entités dans le CRM. Comment récupérer toutes les entités?

Vous ne pouvez récupérer que 5 000 enregistrements à la fois à l’aide de fetch XML.

Pour obtenir plus d’enregistrements, vous devez utiliser un cookie de pagination, voir ici:

Exemple: utiliser FetchXML avec un cookie de pagination

Les bits de code pertinents:

 // Define the fetch atsortingbutes. // Set the number of records per page to resortingeve. int fetchCount = 3; // Initialize the page number. int pageNumber = 1; // Specify the current paging cookie. For resortingeving the first page, // pagingCookie should be null. ssortingng pagingCookie = null; 

La boucle principale modifiée, car l’exemple ne semble pas mettre à jour le cookie de pagination:

 while (true) { // Build fetchXml ssortingng with the placeholders. ssortingng xml = CreateXml(fetchXml, pagingCookie, pageNumber, fetchCount); FetchExpression expression = new FetchExpression(xml); var results = proxy.ResortingeveMultiple(expression); // * Build up results here * // Check for morerecords, if it returns 1. if (results.MoreRecords) { // Increment the page number to resortingeve the next page. pageNumber++; pagingCookie = results.PagingCookie; } else { // If no more records in the result nodes, exit the loop. break; } } 

Personnellement, j’ai tendance à utiliser LINQ plutôt que FetchXML, mais il convient de noter ce que Lasse V. Karlsen a dit: si vous présentez ces informations à l’utilisateur, vous souhaiterez probablement effectuer une sorte de pagination (dans FetchXML ou LINQ).

Vous pouvez utiliser LINQ comme indiqué ci-dessous. Le fournisseur CRM LINQ va automatiquement paginer la requête et exécuter autant de requêtes que nécessaire pour obtenir le résultat complet et renvoyer l’ensemble complet dans un seul object. C’est vraiment pratique pour nous. Cependant, soyez prudent avec cela. Si le jeu de résultats est très volumineux, il sera sensiblement lent et une exception OutOfMemoryException peut même être lancée dans des cas extrêmes.

  public List GetEntities(ssortingng entityName) { OrganizationServiceContext DataContext = new OrganizationServiceContext(ServerConnection.GetOrganizationProxy()); return DataContext.CreateQuery(entityName).toList(); } 

Voici une implémentation alternative pour la pagination avec FetchXML, que j’aime beaucoup mieux que les exemples officiels:

 int page = 1; EntityCollection entityList = new EntityCollection(); do { entityList = Context.ResortingeveMultiple(new FetchExpression(Ssortingng.Format(" ... ", SecurityElement.Escape(entityList.PagingCookie), page++))); // Do something with the results here } while (entityList.MoreRecords); 

J’ai eu le même problème. Je l’ai résolu en incluant l’identifiant de l’entité dans fetch xml ou Query Expression. Si vous incluez pass dans “lead” dans la requête, ajoutez également “leadid”. Ensuite, le cookie de pagination est généré automatiquement pour vous.