private void AddOperationImport(CsdlOperationImport operationImport, List <IEdmEntityContainerElement> elements)
        {
            var functionImport = operationImport as CsdlFunctionImport;
            var actionImport   = operationImport as CsdlActionImport;
            CsdlSemanticsOperationImport semanticsOperation = null;
            EdmSchemaElementKind         filterKind         = EdmSchemaElementKind.Action;

            if (functionImport != null)
            {
                filterKind = EdmSchemaElementKind.Function;
            }

            // OperationImports only work with non-bound operations hence this extra logic in the where clause
            var operations = this.context.FindOperations(operationImport.SchemaOperationQualifiedTypeName).Where(o => o.SchemaElementKind == filterKind && !o.IsBound);

            int operationsCount = 0;

            foreach (IEdmOperation operation in operations)
            {
                if (functionImport != null)
                {
                    semanticsOperation = new CsdlSemanticsFunctionImport(this, functionImport, (IEdmFunction)operation);
                }
                else
                {
                    Debug.Assert(actionImport != null, "actionImport should not be null");
                    semanticsOperation = new CsdlSemanticsActionImport(this, actionImport, (IEdmAction)operation);
                }

                operationsCount++;
                elements.Add(semanticsOperation);
            }

            // If none have been created then its an unresolved operation.
            if (operationsCount == 0)
            {
                if (filterKind == EdmSchemaElementKind.Action)
                {
                    var action = new UnresolvedAction(operationImport.SchemaOperationQualifiedTypeName, Edm.Strings.Bad_UnresolvedOperation(operationImport.SchemaOperationQualifiedTypeName), operationImport.Location);
                    semanticsOperation = new CsdlSemanticsActionImport(this, actionImport, action);
                }
                else
                {
                    Debug.Assert(filterKind == EdmSchemaElementKind.Function, "Should be a function");
                    var function = new UnresolvedFunction(operationImport.SchemaOperationQualifiedTypeName, Edm.Strings.Bad_UnresolvedOperation(operationImport.SchemaOperationQualifiedTypeName), operationImport.Location);
                    semanticsOperation = new CsdlSemanticsFunctionImport(this, functionImport, function);
                }

                elements.Add(semanticsOperation);
            }
        }
Пример #2
0
        internal static void RegisterSchemaElement(IEdmSchemaElement element, Dictionary <string, IEdmSchemaType> schemaTypeDictionary, Dictionary <string, IEdmValueTerm> valueTermDictionary, Dictionary <string, object> functionGroupDictionary, Dictionary <string, IEdmEntityContainer> containerDictionary)
        {
            string str = element.FullName();
            EdmSchemaElementKind schemaElementKind = element.SchemaElementKind;

            switch (schemaElementKind)
            {
            case EdmSchemaElementKind.None:
            {
                throw new InvalidOperationException(Strings.EdmModel_CannotUseElementWithTypeNone);
            }

            case EdmSchemaElementKind.TypeDefinition:
            {
                RegistrationHelper.AddElement <IEdmSchemaType>((IEdmSchemaType)element, str, schemaTypeDictionary, new Func <IEdmSchemaType, IEdmSchemaType, IEdmSchemaType>(RegistrationHelper.CreateAmbiguousTypeBinding));
                return;
            }

            case EdmSchemaElementKind.Function:
            {
                RegistrationHelper.AddFunction <IEdmFunction>((IEdmFunction)element, str, functionGroupDictionary);
                return;
            }

            case EdmSchemaElementKind.ValueTerm:
            {
                RegistrationHelper.AddElement <IEdmValueTerm>((IEdmValueTerm)element, str, valueTermDictionary, new Func <IEdmValueTerm, IEdmValueTerm, IEdmValueTerm>(RegistrationHelper.CreateAmbiguousValueTermBinding));
                return;
            }

            case EdmSchemaElementKind.EntityContainer:
            {
                RegistrationHelper.AddElement <IEdmEntityContainer>((IEdmEntityContainer)element, str, containerDictionary, new Func <IEdmEntityContainer, IEdmEntityContainer, IEdmEntityContainer>(RegistrationHelper.CreateAmbiguousEntityContainerBinding));
                RegistrationHelper.AddElement <IEdmEntityContainer>((IEdmEntityContainer)element, element.Name, containerDictionary, new Func <IEdmEntityContainer, IEdmEntityContainer, IEdmEntityContainer>(RegistrationHelper.CreateAmbiguousEntityContainerBinding));
                return;
            }
            }
            throw new InvalidOperationException(Strings.UnknownEnumVal_SchemaElementKind(element.SchemaElementKind));
        }
Пример #3
0
        public void VisitSchemaElement(IEdmSchemaElement element)
        {
            EdmSchemaElementKind schemaElementKind = element.SchemaElementKind;

            switch (schemaElementKind)
            {
            case EdmSchemaElementKind.None:
            {
                this.ProcessSchemaElement(element);
                return;
            }

            case EdmSchemaElementKind.TypeDefinition:
            {
                this.VisitSchemaType((IEdmType)element);
                return;
            }

            case EdmSchemaElementKind.Function:
            {
                this.ProcessFunction((IEdmFunction)element);
                return;
            }

            case EdmSchemaElementKind.ValueTerm:
            {
                this.ProcessValueTerm((IEdmValueTerm)element);
                return;
            }

            case EdmSchemaElementKind.EntityContainer:
            {
                this.ProcessEntityContainer((IEdmEntityContainer)element);
                return;
            }
            }
            throw new InvalidOperationException(Strings.UnknownEnumVal_SchemaElementKind(element.SchemaElementKind));
        }
Пример #4
0
 private IEnumerable <T> SchemaElementsByKind <T>(IEnumerable <IEdmSchemaElement> schemaElements, EdmSchemaElementKind kind) where T : class
 {
     return(schemaElements
            .Where(element => element.SchemaElementKind == kind)
            .Select(element => element as T));
 }