Example #1
0
        private async Task <TypeInfo> CreateBizType(string tableName)
        {
            var fields = await SchemaManage.GetTableColumns(tableName);

            var entityDef = await SchemaManage.ConvertToEntityDef(fields);

            if (entityDef == null)
            {
                throw new UserFriendlyException("表信息不存在。");
            }

            return(await ReflectionManage.CreateEntityType(entityDef));
        }
Example #2
0
        /// <summary>
        /// 基于 AutoQuery 实现统一的业务表动态查询。
        /// <see cref="http://docs.servicestack.net/autoquery-rdbms"/>
        /// </summary>
        /// <param name="query">包含显示表名及隐式的其它查询条件</param>
        /// <exception cref="UserFriendlyException"></exception>
        public async Task <IQueryResponse> Get(GetBizs query)
        {
            if (string.IsNullOrEmpty(query.TableName))
            {
                throw new UserFriendlyException("表参数不能为空。");
            }

            if (!query.TableName.StartsWith("biz_"))
            {
                throw new UserFriendlyException("只能查询业务表。");
            }

            // 根据表名得到表结构,并且根据表结构动态生成实体
            var entityType = await CreateBizType(query.TableName);

            // 动态生成用于 AutoQuery 的请求对象, 必须继承自 QueryDb<>
            // TODO: 通过设置 NamedConnection 可以自动实现分库的查询
            var routeBaseType = typeof(QueryDb <>).MakeGenericType(entityType);
            var routeType     = await ReflectionManage.CreateEntityType(new EntityDef
            {
                Name       = $"{query.TableName}_route",
                BaseType   = routeBaseType,
                Properties = Enumerable.Empty <EntityProperty>()
            });

            var queryObj = Activator.CreateInstance(routeType);

            // 设置分页参数
            if (query.Skip.HasValue && query.Take.HasValue)
            {
                ((QueryBase)queryObj).Skip = query.Skip;
                ((QueryBase)queryObj).Take = query.Take;
            }

            if (!string.IsNullOrEmpty(query.OrderBy))
            {
                ((QueryBase)queryObj).OrderBy = query.OrderBy;
            }

            if (!string.IsNullOrEmpty(query.OrderByDesc))
            {
                ((QueryBase)queryObj).OrderByDesc = query.OrderByDesc;
            }

            // 调用 AutoQuery 实现动态表查询
            var q      = AutoQuery.CreateQuery((IQueryDb)queryObj, Request.GetRequestParams(), Request);
            var result = AutoQuery.Execute((IQueryDb)queryObj, q);

            return(await Task.FromResult(result));
        }