private async Task <object> GetValue( TypeAccessor edgeObjectTypeAccessor, ConnectionEdge connectionEdge, IGraphRequestContext graphRequestContext, List <ConnectionEdgeDestinationFilter> connectionEdgeDestinationFilters, QueryExecutionContext queryExecutionContext) { var member = edgeObjectTypeAccessor.GetMembers().Single(x => x.Name == connectionEdge.MetaFieldName); var destTypeAccessor = TypeAccessor.Create(member.Type); var destQueryMember = destTypeAccessor.GetMembers().Single(m => m.GetAttribute(typeof(KeyAttribute), true) != null); var qp = new QueryStep(); qp.QueryParameters.Add(new QueryParameter { ContextValue = new ContextValue { Comparison = Comparisons.Equal, Values = new List <object> { connectionEdge.DestinationId } }, MemberModel = new ModelMember(member.Type, destTypeAccessor, destQueryMember, false) }); if (connectionEdgeDestinationFilters != null) { connectionEdgeDestinationFilters.Where(x => x.Type == member.Type.AssemblyQualifiedName) .ToList().ForEach(connectionEdgeDestinationFilter => { qp.QueryParameters.Add(new QueryParameter { ContextValue = new ContextValue { Comparison = Comparisons.Equal, Values = connectionEdgeDestinationFilter.Mapper(queryExecutionContext) }, MemberModel = connectionEdgeDestinationFilter.ModelMember }); }); } var entities = (await _graphQlRepositoryProvider.QueryAsync(EntityQueryName, qp, graphRequestContext)).ToList(); if (entities.Count > 1) { throw new InvalidOperationException(MultipleEntitiesDetectedError); } return(entities.SingleOrDefault()); }
private QueryStep CreateQueryStep(ConnectionEdge connectionEdge) { var qp = new QueryStep(); var destType = Type.GetType(connectionEdge.SourceType); var destTypeAccessor = TypeAccessor.Create(destType); var destQueryMember = destTypeAccessor.GetMembers().Single(m => m.Name.ToLower() == connectionEdge.DestinationFieldName.ToLower()); qp.QueryParameters.Add(new QueryParameter { ContextValue = new ContextValue { Comparison = Comparisons.Equal, Values = new List <object> { connectionEdge.DestinationId } }, MemberModel = new ModelMember(destType, destTypeAccessor, destQueryMember, false) }); return(qp); }
private void HandleConnectionEdge( string sourceId, Type sourceType, Type edgeType, string sourceFieldName, object edgeObjectInstance, List <ConnectionEdge> connectionEdges, InternalConnectionEdgeState internalConnectionEdgeState, Action <object> entityAction, bool isListEdge) { var edgeTypeAccessor = TypeAccessor.Create(edgeType); var connectionEdge = new ConnectionEdge { SourceType = sourceType.AssemblyQualifiedName, SourceFieldName = sourceFieldName, SourceId = sourceId, MetaType = edgeType.AssemblyQualifiedName }; Member destinationId = null; Member destinationModel = null; foreach (var edgeMember in edgeTypeAccessor.GetMembers()) { var connectionEdgeDestinationKey = edgeMember.GetAttribute(typeof(ConnectionEdgeDestinationKeyAttribute), false) as ConnectionEdgeDestinationKeyAttribute; if (connectionEdgeDestinationKey != null) { destinationId = edgeMember; } else { var connectionEdgeDestination = edgeMember.GetAttribute(typeof(ConnectionEdgeDestinationAttribute), false) as ConnectionEdgeDestinationAttribute; if (connectionEdgeDestination != null) { destinationModel = edgeMember; } } } if (destinationId == null) { throw new InvalidProgramException("Property with ConnectionEdgeDestinationKeyAttribute is required on a Connection."); } if (destinationModel == null) { throw new InvalidProgramException("Property with ConnectionEdgeDestinationAttribute is required on a Connection."); } var destId = edgeTypeAccessor[edgeObjectInstance, destinationId.Name]; if (destId == null) { throw new InvalidProgramException("Value on property with ConnectionEdgeDestinationKeyAttribute is required!"); } // Eval destination model instance first. var destObject = edgeTypeAccessor[edgeObjectInstance, destinationModel.Name]; if (destObject != null) { var id = destId.ToString(); DiscoverConnectionEdges(id, destObject, connectionEdges, internalConnectionEdgeState, entityAction); internalConnectionEdgeState.InvokeAction(destObject, id, destinationModel.Type.Name); edgeTypeAccessor[edgeObjectInstance, destinationModel.Name] = null; } connectionEdge.DestinationId = destId.ToString(); connectionEdge.Id = isListEdge ? $"{connectionEdge.SourceFieldName}_src{connectionEdge.SourceId}_des{connectionEdge.DestinationId}" : $"{connectionEdge.SourceFieldName}_{connectionEdge.SourceId}"; connectionEdge.MetaFieldName = destinationModel.Name; connectionEdge.MetaValue = JsonConvert.SerializeObject(edgeObjectInstance); connectionEdges.Add(connectionEdge); }