Example #1
0
        /// <summary>
        /// Осуществляет регистрацию пользовательских OData-actions.
        /// </summary>
        /// <param name="container">Container of user functions.</param>
        /// <param name="dataService">Сервис данных.</param>
        public void RegisterODataActions(IFunctionContainer container, IDataService dataService)
        {
            Dictionary <string, Type> parametersTypes = new Dictionary <string, Type>();

            if (!container.IsRegistered("ActionWithLcs"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "entitySet", typeof(string) }, { "query", typeof(string) }
                };
                container.Register(new Action(
                                       "ActionWithLcs",
                                       (queryParameters, parameters) =>
                {
                    var type  = queryParameters.GetDataObjectType(parameters["entitySet"] as string);
                    var uri   = $"http://a/b/c?{parameters["query"]}";
                    var lcs   = queryParameters.CreateLcs(type, uri);
                    var dobjs = dataService.LoadObjects(lcs);
                    return(dobjs.AsEnumerable());
                },
                                       typeof(IEnumerable <DataObject>),
                                       parametersTypes));
            }

            if (!container.IsRegistered("ActionVoid"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "entitySet", typeof(string) }, { "query", typeof(string) }
                };
                container.Register(new Action(
                                       "ActionVoid",
                                       (queryParameters, parameters) =>
                {
                    var type  = queryParameters.GetDataObjectType(parameters["entitySet"] as string);
                    var uri   = $"http://a/b/c?{parameters["query"]}";
                    var lcs   = queryParameters.CreateLcs(type, uri);
                    var dobjs = dataService.LoadObjects(lcs);
                    return(null);
                },
                                       typeof(void),
                                       parametersTypes));
            }

            if (!container.IsRegistered("ActionEnum"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "пол", typeof(tПол) }
                };
                container.Register(new Action(
                                       "ActionEnum",
                                       (queryParameters, parameters) =>
                {
                    return((tПол)parameters["пол"]);
                },
                                       typeof(tПол),
                                       parametersTypes));
            }

            if (!container.IsRegistered("ActionEntity"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "entity", typeof(КлассСМножествомТипов) }, { "collection", typeof(IEnumerable <КлассСМножествомТипов>) }
                };
                container.Register(new Action(
                                       "ActionEntity",
                                       (queryParameters, parameters) =>
                {
                    IEnumerable <КлассСМножествомТипов> collection = parameters["collection"] as IEnumerable <КлассСМножествомТипов>;
                    var item = collection.ToArray()[0];
                    return(collection);
                },
                                       typeof(IEnumerable <КлассСМножествомТипов>),
                                       parametersTypes));
            }
        }
        /// <summary>
        /// Осуществляет регистрацию пользовательских OData-функций.
        /// </summary>
        /// <param name="container">Container of user functions.</param>
        /// <param name="dataService">Сервис данных.</param>
        public void RegisterODataUserFunctions(IFunctionContainer container, IDataService dataService)
        {
            Dictionary <string, Type> parametersTypes = new Dictionary <string, Type>();

            if (!container.IsRegistered("FunctionWithLcs1"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "entitySet", typeof(string) }
                };
                container.Register(new Function(
                                       "FunctionWithLcs1",
                                       (queryParameters, parameters) =>
                {
                    var type  = queryParameters.GetDataObjectType(parameters["entitySet"] as string);
                    var lcs   = queryParameters.CreateLcs(type);
                    var dobjs = dataService.LoadObjects(lcs);
                    return(dobjs.AsEnumerable());
                },
                                       typeof(IEnumerable <DataObject>),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionWithLcs2"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "entitySet", typeof(string) }, { "query", typeof(string) }
                };
                container.Register(new Function(
                                       "FunctionWithLcs2",
                                       (queryParameters, parameters) =>
                {
                    var type  = queryParameters.GetDataObjectType(parameters["entitySet"] as string);
                    var uri   = $"http://a/b/c?{parameters["query"]}";
                    var lcs   = queryParameters.CreateLcs(type, uri);
                    var dobjs = dataService.LoadObjects(lcs);
                    return(dobjs.Length);
                },
                                       typeof(int),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionString"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "stringParam", typeof(string) }
                };
                container.Register(new Function(
                                       "FunctionString",
                                       (queryParameters, parameters) => parameters["stringParam"],
                                       typeof(string),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionInt"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "intParam", typeof(int) }
                };
                container.Register(new Function(
                                       "FunctionInt",
                                       (queryParameters, parameters) => parameters["intParam"],
                                       typeof(int),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionEntity"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "intParam", typeof(int) }
                };
                container.Register(new Function(
                                       "FunctionEntity",
                                       (queryParameters, parameters) =>
                {
                    var result = (dataService as SQLDataService).Query <Страна>(Страна.Views.СтранаE).ToArray();
                    return(result[(int)parameters["intParam"]]);
                },
                                       typeof(Страна),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionEntitiesCollection"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "intParam", typeof(int) }
                };
                container.Register(new Function(
                                       "FunctionEntitiesCollection",
                                       (queryParameters, parameters) =>
                {
                    var top               = (int)parameters["intParam"];
                    var result            = (dataService as SQLDataService).Query <Страна>(Страна.Views.СтранаE).Take(top).ToArray();
                    queryParameters.Count = result.Length;
                    return(result);
                },
                                       typeof(IEnumerable <Страна>),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionSelectExpandEntity"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "intParam", typeof(int) }
                };
                container.Register(new Function(
                                       "FunctionSelectExpandEntity",
                                       (queryParameters, parameters) =>
                {
                    var result = (dataService as SQLDataService).Query <Медведь>(Медведь.Views.МедведьE).ToArray();
                    return(result[(int)parameters["intParam"]]);
                },
                                       typeof(Медведь),
                                       parametersTypes));
            }

            if (!container.IsRegistered("FunctionEnum"))
            {
                parametersTypes = new Dictionary <string, Type> {
                    { "пол", typeof(tПол) }
                };
                container.Register(new Function(
                                       "FunctionEnum",
                                       (queryParameters, parameters) =>
                {
                    return((tПол)parameters["пол"]);
                },
                                       typeof(tПол),
                                       parametersTypes));
            }
        }
Example #3
0
        /// <summary>
        /// Выполняет пользовательскую функцию.
        /// </summary>
        /// <param name="queryParameters">Параметры запроса.</param>
        /// <returns>Результат выполнения пользовательской функции, преобразованный к типам сущностей EDM-модели или к примитивным типам.</returns>
        internal IHttpActionResult ExecuteUserFunction(QueryParameters queryParameters)
        {
            queryParameters.Count   = null;
            queryParameters.Request = Request;
            ODataPath odataPath = Request.ODataProperties().Path;
            UnboundFunctionPathSegment segment = odataPath.Segments[odataPath.Segments.Count - 1] as UnboundFunctionPathSegment;

            if (segment == null || !_functions.IsRegistered(segment.FunctionName))
            {
                return(SetResult("Function not found"));
            }

            Function function = _functions.GetFunction(segment.FunctionName);
            Dictionary <string, object> parameters = new Dictionary <string, object>();

            foreach (var parameterName in function.ParametersTypes.Keys)
            {
                var parameterValue = segment.GetParameterValue(parameterName);
                if (parameterValue is ODataEnumValue)
                {
                    parameterValue = Enum.Parse(function.ParametersTypes[parameterName], (parameterValue as ODataEnumValue).Value);
                }

                parameters.Add(parameterName, parameterValue);
            }

            var result = function.Handler(queryParameters, parameters);

            if (result == null)
            {
                return(SetResult("Result is null."));
            }

            if (!(result is string) && result is IEnumerable)
            {
                Type type = null;
                if (result.GetType().IsGenericType)
                {
                    Type[] args = result.GetType().GetGenericArguments();
                    if (args.Length == 1)
                    {
                        type = args[0];
                    }
                }

                if (result.GetType().IsArray)
                {
                    type = result.GetType().GetElementType();
                }

                if (type != null && (type.IsSubclassOf(typeof(DataObject)) || type == typeof(DataObject)))
                {
                    var queryOpt = CreateODataQueryOptions(type);

                    QueryOptions = queryOpt;
                    if (QueryOptions.SelectExpand != null && QueryOptions.SelectExpand.SelectExpandClause != null)
                    {
                        Request.ODataProperties().SelectExpandClause = QueryOptions.SelectExpand.SelectExpandClause;
                    }

                    this.type = type;
                    CreateDynamicView();
                    IncludeCount = false;
                    if (queryOpt.Count != null && queryOpt.Count.Value)
                    {
                        IncludeCount = true;
                        if (queryParameters.Count != null)
                        {
                            Count = (int)queryParameters.Count;
                        }
                        else
                        {
                            Count = GetObjectsCount(type, queryOpt);
                        }
                    }

                    NameValueCollection queryParams = Request.RequestUri.ParseQueryString();

                    if ((_model.ExportService != null || _model.ODataExportService != null) && (Request.Properties.ContainsKey(PostPatchHandler.AcceptApplicationMsExcel) || Convert.ToBoolean(queryParams.Get("exportExcel"))))
                    {
                        _objs = (result as IEnumerable).Cast <DataObject>().ToArray();
                        return(ResponseMessage(CreateExcel(queryParams)));
                    }

                    var coll = GetEdmCollection((IEnumerable)result, type, 1, null, _dynamicView);
                    return(SetResult(coll));
                }

                return(SetResult(result));
            }

            if (result is DataObject)
            {
                QueryOptions = CreateODataQueryOptions(result.GetType());
                if (QueryOptions.SelectExpand != null && QueryOptions.SelectExpand.SelectExpandClause != null)
                {
                    Request.ODataProperties().SelectExpandClause = QueryOptions.SelectExpand.SelectExpandClause;
                }

                this.type = result.GetType();
                CreateDynamicView();
                var entityType = _model.GetEdmEntityType(this.type);
                return(SetResult(GetEdmObject(entityType, result, 1, null, _dynamicView)));
            }

            return(SetResultPrimitive(result.GetType(), result));
        }