Dynamics SDK Paging Records

I never thought I’d have a case when I’d need to work with over 5,000 records from the Dynamics SDK.

The scenario here is that I was trying to reproduce some production issues and validate out some code changes with a higher threshold of objects.  However, as I started testing, I noticed I wasn’t bringing back everything and had hit the that magical 5,000 limit.

Without wanting to change it, I modified by query to support the retrieval of 5,000+ items that would return to my service to be worked on.

bool KeepSearching = true;
 EntityCollection results = null;
 Dictionary <Guid, Entity> Accessors = new Dictionary<Guid, Entity>();

QueryExpression query = new QueryExpression();
 query.EntityName = "contact";
 query.Criteria.AddCondition(new ConditionExpression("contactid", ConditionOperator.Equal, ContactId));
 query.ColumnSet = new ColumnSet(new string[] { "contactid", "fullname"});
 query.PageInfo = new PagingInfo();
  query.PageInfo.PageNumber = 1;

results = _service.RetrieveMultiple(query);

while (KeepSearching)
 {
 AppendContactResults(Accessors , results);

if (results.MoreRecords)
 {
 query.PageInfo.PageNumber++;
 query.PageInfo.PagingCookie = results.PagingCookie;
 results = _service.RetrieveMultiple(query);
 }
 else
 {
 KeepSearching = false;
 }
 }

The code itself is pretty simple – I append the paging info and request for the first page to come back (note even if you do not exceed the first page, you don’t need to change this code).

When the results are returned, I check if there are moreresults.  If there are no more results, I process what I have, kill the while loop and move on.  If there ARE more results, I queue up my paging information, set the watermark (the PagingCookie) and make another call to see what I missed.

The loop takes over and will close itself when there are no more results.

 

Post A Reply

%d bloggers like this: