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