private List <Entity> RetrieveRecords(Record recordsConfig, Guid?recordId) { log.Log($"Injecting ID field in FetchXML ..."); recordsConfig.FetchXml = InjectIdFieldInFetchXml(recordsConfig.FetchXml, recordsConfig.LogicalName); log.Log($"Finished injecting ID field in FetchXML."); log.Log($"Cloning query ..."); var query = service.CloneQuery(new FetchExpression(recordsConfig.FetchXml)); log.Log($"Finished cloning query."); // replace recordId placeholders with the record ID if given if (recordId != null) { foreach (var values in query.LinkEntities .SelectMany(l => l.LinkCriteria.Conditions .Where(c => c.Values.Any(v => v is Guid vs && vs == Guid.Empty))) .Select(c => c.Values)) { // ToArray: can't modify collection inside loop foreach (var value in values.Where(v => v is Guid vs && vs == Guid.Empty).ToArray()) { values.Remove(value); values.Add(recordId); } } } log.Log($"Retrieving records using FetchXML for '{recordsConfig.LogicalName}' ..."); var records = service.RetrieveMultiple <Entity>(query).Distinct(new EntityComparer()).ToList(); log.Log($"Finished retrieving records using FetchXML for '{recordsConfig.LogicalName}'. Found {records.Count}."); return(records); }
private List <Entity> RetrieveRecords(string fetchXml) { retrieveCache.TryGetValue(fetchXml, out var existingRecords); retrieveCache[fetchXml] = existingRecords = existingRecords ?? service.RetrieveMultiple <Entity>(service.CloneQuery(new FetchExpression(fetchXml))) .Distinct(new EntityComparer()).ToList(); return(existingRecords); }