/// <summary> /// Builds the root entity. /// </summary> /// <param name="node">The root node.</param> /// <param name="context">The context.</param> /// <returns>Entity.</returns> /// <exception cref="System.Exception">Unknown report node type.</exception> internal static Entity BuildReportNode(ReportNode node, FromEntityContext context) { if (node == null) { throw new ArgumentNullException(nameof(node)); } if (context == null) { throw new ArgumentNullException(nameof(context)); } Entity structuredQueryEntity; if (node.Is <AggregateReportNode>()) { structuredQueryEntity = BuildAggregateReportNode(node.As <AggregateReportNode>(), context); } else if (node.Is <RelationshipReportNode>()) { structuredQueryEntity = BuildRelationshipReportNode(node.As <RelationshipReportNode>(), context); } else if (node.Is <CustomJoinReportNode>( )) { structuredQueryEntity = BuildCustomJoinReportNode(node.As <CustomJoinReportNode>( ), context); } else if (node.Is <DerivedTypeReportNode>()) { structuredQueryEntity = BuildDerivedTypeReportNode(node.As <DerivedTypeReportNode>(), context); } else if (node.Is <ResourceReportNode>()) { structuredQueryEntity = BuildResourceReportNode(node.As <ResourceReportNode>(), context); } else { throw new Exception("Unknown report node type. " + node.GetType().Name); } if (node.RelatedReportNodes != null && node.RelatedReportNodes.Count > 0) { structuredQueryEntity.RelatedEntities = new List <Entity>(node.RelatedReportNodes.Select(relatedReportNode => BuildReportNode(relatedReportNode, context)).Where(entity => entity != null)); } if (structuredQueryEntity != null) { // Only valid nodes get placed into the ReportNodeToEntityMap // (but ReportNodeMap may contain invalid nodes for historical reasons) context.ReportNodeToEntityMap[node.Id] = structuredQueryEntity; } return(structuredQueryEntity); }