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); } }
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)); }
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)); }
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)); }