private static void AddProcedures(this EdmEntityContainer container, IEnumerable <ProcedureConfiguration> configurations, Dictionary <string, IEdmStructuredType> edmTypeMap, Dictionary <string, EdmEntitySet> edmEntitySetMap)
        {
            foreach (ProcedureConfiguration procedure in configurations)
            {
                switch (procedure.Kind)
                {
                case ProcedureKind.Action:
                    ActionConfiguration action          = procedure as ActionConfiguration;
                    IEdmTypeReference   returnReference = GetEdmTypeReference(edmTypeMap, action.ReturnType, nullable: true);
                    IEdmExpression      expression      = GetEdmEntitySetExpression(edmEntitySetMap, action);

                    EdmFunctionImport functionImport = new EdmFunctionImport(container, action.Name, returnReference, expression, action.IsSideEffecting, action.IsComposable, action.IsBindable);
                    foreach (ParameterConfiguration parameter in action.Parameters)
                    {
                        // TODO: http://aspnetwebstack.codeplex.com/workitem/417
                        IEdmTypeReference    parameterTypeReference = GetEdmTypeReference(edmTypeMap, parameter.TypeConfiguration, nullable: true);
                        EdmFunctionParameter functionParameter      = new EdmFunctionParameter(functionImport, parameter.Name, parameterTypeReference, EdmFunctionParameterMode.In);
                        functionImport.AddParameter(functionParameter);
                    }
                    container.AddElement(functionImport);
                    break;

                case ProcedureKind.Function:
                    Contract.Assert(false, "Functions are not supported.");
                    break;

                case ProcedureKind.ServiceOperation:
                    Contract.Assert(false, "ServiceOperations are not supported.");
                    break;
                }
            }
        }
        internal MetadataProviderEdmFunctionImport(MetadataProviderEdmModel model, MetadataProviderEdmEntityContainer container, OperationWrapper operation)
        {
            this.container = container;
            this.model     = model;
            this.operation = operation;
            if (operation.Kind == OperationKind.Action)
            {
                this.isSideEffecting = true;
                this.isComposable    = false;
                this.isBindable      = this.operation.BindingParameter != null;
            }
            else
            {
                this.isComposable    = false;
                this.isSideEffecting = true;
                this.isBindable      = false;
            }
            ResourceSetPathExpression resultSetPathExpression = operation.ResultSetPathExpression;

            this.entitySetPath = (resultSetPathExpression == null) ? null : resultSetPathExpression.PathExpression;
            if (operation.Kind == OperationKind.ServiceOperation)
            {
                model.SetHttpMethod(this, operation.Method);
            }
            string mimeType = operation.MimeType;

            if (!string.IsNullOrEmpty(mimeType))
            {
                model.SetMimeType(this, mimeType);
            }
            if (operation.OperationParameterBindingKind == OperationParameterBindingKind.Always)
            {
                model.SetIsAlwaysBindable(this, true);
            }
            ReadOnlyCollection <OperationParameter> parameters = operation.Parameters;

            if ((parameters != null) && (parameters.Count > 0))
            {
                List <IEdmFunctionParameter> list = new List <IEdmFunctionParameter>(parameters.Count);
                foreach (OperationParameter parameter in parameters)
                {
                    IEdmTypeReference typeReference = this.model.EnsureTypeReference(parameter.ParameterType, null);
                    if (!typeReference.IsNullable && (this.model.GetEdmVersion() < DataServiceProtocolVersion.V3.ToVersion()))
                    {
                        typeReference = typeReference.Clone(true);
                    }
                    EdmFunctionParameter item = new EdmFunctionParameter(this, parameter.Name, typeReference, EdmFunctionParameterMode.In);
                    list.Add(item);
                }
                this.parameters = new ReadOnlyCollection <IEdmFunctionParameter>(list);
            }
        }
        private static void AddProcedures(this IEdmModel model, IEnumerable <ProcedureConfiguration> configurations, EdmEntityContainer container, Dictionary <Type, IEdmStructuredType> edmTypeMap, Dictionary <string, EdmEntitySet> edmEntitySetMap)
        {
            foreach (ProcedureConfiguration procedure in configurations)
            {
                switch (procedure.Kind)
                {
                case ProcedureKind.Action:
                    ActionConfiguration action          = procedure as ActionConfiguration;
                    IEdmTypeReference   returnReference = GetEdmTypeReference(edmTypeMap, action.ReturnType, nullable: true);
                    IEdmExpression      expression      = GetEdmEntitySetExpression(edmEntitySetMap, action);

                    EdmFunctionImport functionImport = new EdmFunctionImport(container, action.Name, returnReference, expression, action.IsSideEffecting, action.IsComposable, action.IsBindable);
                    if (action.IsBindable)
                    {
                        model.SetIsAlwaysBindable(functionImport, action.IsAlwaysBindable);
                        if (action.BindingParameter.TypeConfiguration.Kind == EdmTypeKind.Entity)
                        {
                            Func <EntityInstanceContext, Uri> actionFactory = action.GetActionLink();
                            if (actionFactory != null)
                            {
                                model.SetActionLinkBuilder(functionImport, new ActionLinkBuilder(actionFactory, action.FollowsConventions));
                            }
                        }
                    }

                    foreach (ParameterConfiguration parameter in action.Parameters)
                    {
                        // TODO: http://aspnetwebstack.codeplex.com/workitem/417
                        bool isParameterOptional = EdmLibHelpers.IsNullable(parameter.TypeConfiguration.ClrType);
                        IEdmTypeReference    parameterTypeReference = GetEdmTypeReference(edmTypeMap, parameter.TypeConfiguration, nullable: isParameterOptional);
                        EdmFunctionParameter functionParameter      = new EdmFunctionParameter(functionImport, parameter.Name, parameterTypeReference, EdmFunctionParameterMode.In);
                        functionImport.AddParameter(functionParameter);
                    }
                    container.AddElement(functionImport);
                    break;

                case ProcedureKind.Function:
                    Contract.Assert(false, "Functions are not supported.");
                    break;

                case ProcedureKind.ServiceOperation:
                    Contract.Assert(false, "ServiceOperations are not supported.");
                    break;
                }
            }
        }