protected Expression <Func <InputObjectGraphType> > BuildEntityOrderByGraphTypeFactory <TEntity>(params IPropertyMap[] properties) where TEntity : class { var entityOrderByGraphType = typeof(InputObjectGraphType); // collect the body var bodyExprs = new List <Expression>(); // var entityOrderByType = new InputObjectGraphType(); var entityOrderByTypeVariableExpr = Expression.Variable(entityOrderByGraphType, "entityOrderByType"); var newEntityOrderByGraphTypeExpr = Expression.New(entityOrderByGraphType); var assignEntityOrderByTypeVariableExpr = Expression.Assign(entityOrderByTypeVariableExpr, newEntityOrderByGraphTypeExpr); bodyExprs.Add(assignEntityOrderByTypeVariableExpr); // entityOrderByType.Name = $"{EntityName}_OrderBy_Type"; var assignEntityOrderByTypeNameExpr = GraphTypeBuilder.CreateObjectGraphAssignPropertyExpression( entityOrderByTypeVariableExpr, entityOrderByGraphType, nameof(InputObjectGraphType.Name), () => GetEntityOrderByTypeName <TEntity>()); bodyExprs.Add(assignEntityOrderByTypeNameExpr); // entityOrderByType.Description = $"ordering options when selecting data from {EntityName}"; var assignEntityOrderByTypeDescriptionExpr = GraphTypeBuilder.CreateObjectGraphAssignPropertyExpression( entityOrderByTypeVariableExpr, entityOrderByGraphType, nameof(InputObjectGraphType.Description), () => GetEntityOrderByTypeDescription <TEntity>()); bodyExprs.Add(assignEntityOrderByTypeDescriptionExpr); if (properties.IsNotEmpty()) { foreach (var property in properties.Where(p => !p.Ignored && !p.IsReadOnly)) { // entityOrderByType.Field<OrderBy_Type>(property.Name) var fieldTypeExpr = GraphTypeBuilder.CreateObjectGraphFieldByGraphExpression( entityOrderByTypeVariableExpr, typeof(OrderBy_Type), property); bodyExprs.Add(fieldTypeExpr); } } // code: return (InputObjectGraphType)entityOrderByType; var castResultExpr = Expression.Convert(entityOrderByTypeVariableExpr, entityOrderByGraphType); bodyExprs.Add(castResultExpr); var factoryBodyExpr = Expression.Block( entityOrderByGraphType, /* return type */ new[] { entityOrderByTypeVariableExpr } /* local variables */, bodyExprs /* body expressions */); return(Expression.Lambda <Func <InputObjectGraphType> >(factoryBodyExpr)); }
protected Expression <Func <InputObjectGraphType> > BuildEntityPredicateGraphTypeFactory <TEntity>(params IPropertyMap[] properties) where TEntity : class { var entityPredicateGraphType = typeof(InputObjectGraphType); // collect the body var bodyExprs = new List <Expression>(); // var entityPredicateType = new InputObjectGraphType(); var entityPredicateTypeVariableExpr = Expression.Variable(entityPredicateGraphType, "entityPredicateType"); var newEntityPredicateGraphTypeExpr = Expression.New(entityPredicateGraphType); var assignEntityPredicateTypeVariableExpr = Expression.Assign(entityPredicateTypeVariableExpr, newEntityPredicateGraphTypeExpr); bodyExprs.Add(assignEntityPredicateTypeVariableExpr); // entityPredicateType.Name = $"{EntityName}_Predicate_Type"; var assignEntityPredicateTypeNameExpr = GraphTypeBuilder.CreateObjectGraphAssignPropertyExpression( entityPredicateTypeVariableExpr, entityPredicateGraphType, nameof(InputObjectGraphType.Name), () => GetEntityPredicateTypeName <TEntity>()); bodyExprs.Add(assignEntityPredicateTypeNameExpr); // entityPredicateType.Description = $"Boolean expression to filter rows from the resource {EntityName}. All fields are combined with a logical 'AND'."; var assignEntityPredicateTypeDescriptionExpr = GraphTypeBuilder.CreateObjectGraphAssignPropertyExpression( entityPredicateTypeVariableExpr, entityPredicateGraphType, nameof(InputObjectGraphType.Description), () => GetEntityPredicateTypeDescription <TEntity>()); bodyExprs.Add(assignEntityPredicateTypeDescriptionExpr); // entityPredicateType.Field("_and", new ListGraphType(entityPredicateType)); var newListEntityPredicateTypeExpr = Expression.New(typeof(ListGraphType).GetConstructors()[0], entityPredicateTypeVariableExpr); var objectGraphFieldByGraphExtMethodParamExprs = BuildObjectGraphFieldByGraphExtMethodParamExpressions(_objectGraphFieldByGraphExtensionMethod, entityPredicateTypeVariableExpr, Expression.Constant("_and"), newListEntityPredicateTypeExpr); var predicateAndFieldTypeExpr = Expression.Call(_objectGraphFieldByGraphExtensionMethod, objectGraphFieldByGraphExtMethodParamExprs); bodyExprs.Add(predicateAndFieldTypeExpr); // entityPredicateType.Field("_or", new ListGraphType(entityPredicateType)); objectGraphFieldByGraphExtMethodParamExprs = BuildObjectGraphFieldByGraphExtMethodParamExpressions(_objectGraphFieldByGraphExtensionMethod, entityPredicateTypeVariableExpr, Expression.Constant("_or"), newListEntityPredicateTypeExpr); var predicateOrFieldTypeExpr = Expression.Call(_objectGraphFieldByGraphExtensionMethod, objectGraphFieldByGraphExtMethodParamExprs); bodyExprs.Add(predicateOrFieldTypeExpr); if (properties.IsNotEmpty()) { foreach (var property in properties.Where(p => !p.Ignored && !p.IsReadOnly)) { // entityPredicateType.Field<ComparisonExpr_Type>(property.Name) var propertyComparisonExprGraphType = property.PropertyInfo.PropertyType.GetComparisonExprGraphType(); var predicateComparisonFieldTypeExpr = GraphTypeBuilder.CreateObjectGraphFieldByGraphExpression( entityPredicateTypeVariableExpr, propertyComparisonExprGraphType, property); bodyExprs.Add(predicateComparisonFieldTypeExpr); } } // code: return (InputObjectGraphType)entityPredicateType; var castResultExpr = Expression.Convert(entityPredicateTypeVariableExpr, entityPredicateGraphType); bodyExprs.Add(castResultExpr); var factoryBodyExpr = Expression.Block( entityPredicateGraphType, /* return type */ new[] { entityPredicateTypeVariableExpr } /* local variables */, bodyExprs /* body expressions */); return(Expression.Lambda <Func <InputObjectGraphType> >(factoryBodyExpr)); }