/// <summary> /// Try to bind the idenfier as operation import (function import or action import) segment, /// Append it into path. /// </summary> private static bool TryBindOperationImport(string identifier, string parenthesisExpressions, IEdmModel model, IList <PathSegment> path, PathParserSettings settings) { // split the parameter key/value pair parenthesisExpressions.ExtractKeyValuePairs(out IDictionary <string, string> parameters, out string remaining); IList <string> parameterNames = parameters == null ? null : parameters.Keys.ToList(); IEdmOperationImport operationImport = OperationHelper.ResolveOperationImports(identifier, parameterNames, model, settings.EnableCaseInsensitive); if (operationImport != null) { operationImport.TryGetStaticEntitySet(model, out IEdmEntitySetBase entitySetBase); path.Add(new OperationImportSegment(operationImport, entitySetBase)); if (remaining != null && operationImport.IsFunctionImport()) { IEdmFunction function = (IEdmFunction)operationImport.Operation; if (function.IsComposable) { if (TryBindKeySegment(parenthesisExpressions, path)) { return(true); } } } return(true); } return(false); }
/// <summary> /// Try to bind the idenfier as bound operation segment, /// Append it into path. /// </summary> internal static bool TryBindOperations(string identifier, string parenthesisExpressions, IEdmModel model, IList <PathSegment> path, PathParserSettings settings) { PathSegment preSegment = path.LastOrDefault(); if (preSegment == null) { // bound operation cannot be the first segment. return(false); } IEdmType bindingType = preSegment.EdmType; // operation parenthesisExpressions.ExtractKeyValuePairs(out IDictionary <string, string> parameters, out string remaining); IList <string> parameterNames = parameters == null ? null : parameters.Keys.ToList(); IEdmOperation operation = OperationHelper.ResolveOperations(identifier, parameterNames, bindingType, model, settings.EnableCaseInsensitive); if (operation != null) { IEdmEntitySetBase targetset = null; if (operation.ReturnType != null) { IEdmNavigationSource source = preSegment == null ? null : preSegment.NavigationSource; targetset = operation.GetTargetEntitySet(source, model); } path.Add(new OperationSegment(operation, targetset)); if (remaining != null && operation.IsFunction()) { IEdmFunction function = (IEdmFunction)operation; if (function.IsComposable) { // to process the ~/ .../ NS.Function(p1 ={ abc})({ id}) if (TryBindKeySegment(parenthesisExpressions, path)) { return(true); } } } return(true); } return(false); }