From 5dd256f76c9f5cee1644bdf2dcc2b136db81e513 Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Fri, 7 Apr 2023 18:08:49 +0200 Subject: [PATCH] Improve performance of response serialization for large number of included resources --- .../Serialization/Response/ResourceObjectTreeNode.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/JsonApiDotNetCore/Serialization/Response/ResourceObjectTreeNode.cs b/src/JsonApiDotNetCore/Serialization/Response/ResourceObjectTreeNode.cs index 4c3a44fe38..6226d6e597 100644 --- a/src/JsonApiDotNetCore/Serialization/Response/ResourceObjectTreeNode.cs +++ b/src/JsonApiDotNetCore/Serialization/Response/ResourceObjectTreeNode.cs @@ -181,13 +181,14 @@ public IList GetResponseIncluded() VisitRelationshipChildrenInSubtree(child, visited); } - List includes = visited.Select(node => node.ResourceObject).ToList(); + ISet primaryResourceObjectSet = GetDirectChildren().Select(node => node.ResourceObject).ToHashSet(ResourceObjectComparer.Instance); + List includes = new(); - foreach (ResourceObject primaryResourceObject in GetDirectChildren().Select(node => node.ResourceObject)) + foreach (ResourceObject include in visited.Select(node => node.ResourceObject)) { - if (includes.Contains(primaryResourceObject, ResourceObjectComparer.Instance)) + if (!primaryResourceObjectSet.Contains(include)) { - includes.Remove(primaryResourceObject); + includes.Add(include); } }