From 9ffed5179d7c651d43871a05ca7e65c46de8c066 Mon Sep 17 00:00:00 2001 From: Arvind Viswakarma Date: Mon, 17 Nov 2025 18:26:12 +0530 Subject: [PATCH 1/2] Retrieve multiple batched to allow passing large number of solutions --- .../Helper/MetadataHelper.cs | 106 +++++++++++------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs b/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs index 00d4bd4..02752d0 100644 --- a/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs +++ b/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs @@ -1,4 +1,4 @@ -using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; using Microsoft.Xrm.Sdk.Metadata.Query; @@ -16,58 +16,78 @@ namespace MsCrmTools.MetadataDocumentGenerator.Helper /// internal class MetadataHelper { + private const int SOLUTION_BATCH_SIZE = 50; // Maximum solutions to process in a single batch + private const int ENTITY_METADATA_BATCH_SIZE = 100; // Maximum entity metadata IDs to retrieve in a single request + public static List GetEntities(List solutions, IOrganizationService service) { - var list = new List(); + var allObjectIds = new HashSet(); // Use HashSet to avoid duplicates if (solutions.Count > 0) { - var components = service.RetrieveMultiple(new QueryExpression("solutioncomponent") + // Process solutions in batches to avoid request size limits + for (int i = 0; i < solutions.Count; i += SOLUTION_BATCH_SIZE) { - ColumnSet = new ColumnSet("objectid"), - NoLock = true, - Criteria = new FilterExpression + var batch = solutions.Skip(i).Take(SOLUTION_BATCH_SIZE).ToList(); + + var components = service.RetrieveMultiple(new QueryExpression("solutioncomponent") { - Conditions = + ColumnSet = new ColumnSet("objectid"), + NoLock = true, + Criteria = new FilterExpression { - new ConditionExpression("solutionid", ConditionOperator.In, - solutions.Select(s => s.Id).ToArray()), - new ConditionExpression("componenttype", ConditionOperator.Equal, 1) + Conditions = + { + new ConditionExpression("solutionid", ConditionOperator.In, batch.Select(s => s.Id).ToArray()), + new ConditionExpression("componenttype", ConditionOperator.Equal, 1) + } } - } - }).Entities; + }).Entities; - list = components.Select(component => component.GetAttributeValue("objectid")) - .ToList(); + // Add unique object IDs to the set + foreach (var component in components) + { + allObjectIds.Add(component.GetAttributeValue("objectid")); + } + } } - EntityQueryExpression entityQueryExpression = new EntityQueryExpression - { - Criteria = new MetadataFilterExpression(LogicalOperator.Or), - Properties = new MetadataPropertiesExpression - { - AllProperties = true - } - }; + // Convert to list for batching + var allEntityIds = allObjectIds.ToList(); + var allEntityMetadata = new List(); - if (list.Count > 0) + // Process entity metadata retrieval in batches to avoid large query issues + for (int i = 0; i < allEntityIds.Count; i += ENTITY_METADATA_BATCH_SIZE) { - list.ForEach(id => + var entityBatch = allEntityIds.Skip(i).Take(ENTITY_METADATA_BATCH_SIZE).ToList(); + + EntityQueryExpression entityQueryExpression = new EntityQueryExpression { - entityQueryExpression.Criteria.Conditions.Add( - new MetadataConditionExpression("MetadataId", MetadataConditionOperator.Equals, id)); - }); - } + Criteria = new MetadataFilterExpression(LogicalOperator.Or), + Properties = new MetadataPropertiesExpression + { + AllProperties = true + } + }; - RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest - { - Query = entityQueryExpression, - ClientVersionStamp = null - }; + // Add metadata conditions for this batch + entityBatch.ForEach(id => + { + entityQueryExpression.Criteria.Conditions.Add( + new MetadataConditionExpression("MetadataId", MetadataConditionOperator.Equals, id)); + }); - var response = (RetrieveMetadataChangesResponse)service.Execute(retrieveMetadataChangesRequest); + RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest + { + Query = entityQueryExpression, + ClientVersionStamp = null + }; - return response.EntityMetadata.ToList(); + var response = (RetrieveMetadataChangesResponse)service.Execute(retrieveMetadataChangesRequest); + allEntityMetadata.AddRange(response.EntityMetadata); + } + + return allEntityMetadata; } /// @@ -128,10 +148,10 @@ public static IEnumerable RetrieveEntityFormList(string logicalName, IOr Criteria = new FilterExpression { Conditions = - { - new ConditionExpression("objecttypecode", ConditionOperator.Equal, logicalName), - new ConditionExpression("type", ConditionOperator.In, new[] {2,7}), - } + { + new ConditionExpression("objecttypecode", ConditionOperator.Equal, logicalName), + new ConditionExpression("type", ConditionOperator.In, new[] {2,7}), + } } }; @@ -160,10 +180,10 @@ public static List RetrieveEntityForms(string logicalName, List Date: Mon, 17 Nov 2025 18:44:17 +0530 Subject: [PATCH 2/2] fixed formatting --- .../Helper/MetadataHelper.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs b/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs index 02752d0..bf15979 100644 --- a/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs +++ b/MsCrmTools.MetadataDocumentGenerator/Helper/MetadataHelper.cs @@ -37,10 +37,10 @@ public static List GetEntities(List solutions, IOrganiza Criteria = new FilterExpression { Conditions = - { - new ConditionExpression("solutionid", ConditionOperator.In, batch.Select(s => s.Id).ToArray()), - new ConditionExpression("componenttype", ConditionOperator.Equal, 1) - } + { + new ConditionExpression("solutionid", ConditionOperator.In, batch.Select(s => s.Id).ToArray()), + new ConditionExpression("componenttype", ConditionOperator.Equal, 1) + } } }).Entities; @@ -72,10 +72,10 @@ public static List GetEntities(List solutions, IOrganiza // Add metadata conditions for this batch entityBatch.ForEach(id => - { - entityQueryExpression.Criteria.Conditions.Add( - new MetadataConditionExpression("MetadataId", MetadataConditionOperator.Equals, id)); - }); + { + entityQueryExpression.Criteria.Conditions.Add( + new MetadataConditionExpression("MetadataId", MetadataConditionOperator.Equals, id)); + }); RetrieveMetadataChangesRequest retrieveMetadataChangesRequest = new RetrieveMetadataChangesRequest { @@ -148,10 +148,10 @@ public static IEnumerable RetrieveEntityFormList(string logicalName, IOr Criteria = new FilterExpression { Conditions = - { - new ConditionExpression("objecttypecode", ConditionOperator.Equal, logicalName), - new ConditionExpression("type", ConditionOperator.In, new[] {2,7}), - } + { + new ConditionExpression("objecttypecode", ConditionOperator.Equal, logicalName), + new ConditionExpression("type", ConditionOperator.In, new[] {2,7}), + } } }; @@ -180,10 +180,10 @@ public static List RetrieveEntityForms(string logicalName, List