コード例 #1
0
        public static List <IPrefilterBase> GetQueryPrefilters(KeyValuePair <Type, string> property, QueryQueryCommand queryCommand,
                                                               HttpInformation information, IServiceProvider serviceProvider)
        {
            ModelAttributesInfo modelAttributesInfo = property.Key.GetModelAttributesInfo();
            QueryAttribute      query = modelAttributesInfo.QueryAttributes
                                        .FirstOrDefault(q =>
                                                        q.QueryName.Equals(queryCommand.QueryName, StringComparison.InvariantCultureIgnoreCase));

            DefaultQueryAttribute defaultQuery = modelAttributesInfo.DefaultQueryAttributes.SingleOrDefault();

            if (query == null)
            {
                throw new QueryNotFoundException(queryCommand.ContextName, queryCommand.CollectionName, queryCommand.QueryName);
            }

            dynamic queryBuilder =
                Activator.CreateInstance(typeof(SapphireQueryBuilder <>).MakeGenericType(property.Key));

            if (defaultQuery != null)
            {
                if (defaultQuery.FunctionLambda != null)
                {
                    queryBuilder = defaultQuery.FunctionLambda(queryBuilder, information, queryCommand.Parameters);
                }
                else if (defaultQuery.FunctionInfo != null)
                {
                    queryBuilder = defaultQuery.FunctionInfo.Invoke(null,
                                                                    defaultQuery.FunctionInfo.CreateParameters(information, serviceProvider, queryCommand.Parameters, (object)queryBuilder));
                }
            }

            if (query.FunctionLambda != null)
            {
                queryBuilder = query.FunctionLambda(queryBuilder, information, queryCommand.Parameters);
            }
            else if (query.FunctionInfo != null)
            {
                queryBuilder = query.FunctionInfo.Invoke(null,
                                                         query.FunctionInfo.CreateParameters(information, serviceProvider, queryCommand.Parameters, (object)queryBuilder));
            }

            List <IPrefilterBase> prefilters = typeof(SapphireQueryBuilderBase <>)
                                               .MakeGenericType(property.Key)
                                               .GetField("prefilters")?
                                               .GetValue(queryBuilder);

            prefilters.ForEach(prefilter => prefilter.Initialize(property.Key));

            return(prefilters);
        }