/// <summary> /// To the tree node path. /// </summary> /// <returns>注意:可能返回Null</returns> /// <param name="parentMember">Parent member.</param> public async Task <TreeNodePath> ToTreeNodePathAsync(MemberExpression parentMember, Expression displayText) { //TODO:目前实现仅支持单一主键且为Guid的树状结构 //TODO:验证parentMember为EntityExpression,且非聚合引用,且引用目标为自身 var parent = parentMember as EntityExpression; if (Expression.IsNull(parent)) { throw new ArgumentException("parentMember must be EntityRef", nameof(parentMember)); } var model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); var parentModel = (EntityRefModel)model.GetMember(parent.Name, true); if (parentModel.IsAggregationRef) { throw new ArgumentException("can not be AggregationRef", nameof(parentMember)); } if (parentModel.RefModelIds[0] != model.Id) { throw new ArgumentException("must be self-ref", nameof(parentMember)); } var pkName = model.GetMember(model.SqlStoreOptions.PrimaryKeys[0].MemberId, true).Name; var fkName = model.GetMember(parentModel.FKMemberIds[0], true).Name; Purpose = QueryPurpose.ToTreeNodePath; AddSelectItem(new SqlSelectItemExpression(T[pkName])); AddSelectItem(new SqlSelectItemExpression(T[fkName], "ParentId")); AddSelectItem(new SqlSelectItemExpression(displayText, "Text")); var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); using var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); var list = new List <TreeNodeInfo>(); using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { list.Add(new TreeNodeInfo() { ID = reader.GetGuid(0), Text = reader.GetString(2) }); } return(new TreeNodePath(list)); }
/// <summary> /// 动态查询,返回匿名类列表 /// </summary> public async Task <IList <TResult> > ToListAsync <TResult>(Func <SqlRowReader, TResult> selector, params SqlSelectItem[] selectItem) { if (selectItem == null || selectItem.Length <= 0) { throw new ArgumentException("must select some one"); } //if (SkipSize > -1 && !HasSortItems) // throw new ArgumentException("Paged query must has sort items."); //TODO:加入默认主键排序 Purpose = QueryPurpose.ToDataTable; if (_selects != null) { _selects.Clear(); } for (int i = 0; i < selectItem.Length; i++) { AddSelectItem(selectItem[i].Target); } //递交查询 var model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); using var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); var list = new List <TResult>(); try { using var reader = await cmd.ExecuteReaderAsync(); SqlRowReader rr = new SqlRowReader(reader); while (await reader.ReadAsync()) { list.Add(selector(rr)); } } catch (Exception ex) { Log.Warn($"Exec sql error: {ex.Message}\n{cmd.CommandText}"); throw; } return(list); }
public async Task <int> CountAsync() { Purpose = QueryPurpose.Count; var model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); using var reader = await cmd.ExecuteReaderAsync(); if (!await reader.ReadAsync()) { return(0); } return(reader.GetInt32(0)); }
public async Task <Entity> ToSingleAsync() { Purpose = QueryPurpose.ToSingleEntity; //添加选择项 var model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); AddAllSelects(this, model, T, null); if (_rootIncluder != null) { await _rootIncluder.AddSelects(this, model); } //递交查询 var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); using var reader = await cmd.ExecuteReaderAsync(); Entity res = null; if (await reader.ReadAsync()) { res = FillEntity(model, reader); } if (_rootIncluder != null) { await _rootIncluder.LoadEntitySets(db, res, null); //TODO:fix txn } return(res); }
public async Task <EntityList> ToListAsync() { Purpose = QueryPurpose.ToEntityList; //添加选择项 var model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); AddAllSelects(this, model, T, null); if (_rootIncluder != null) { await _rootIncluder.AddSelects(this, model); } var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); var list = new EntityList(T.ModelID); using var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { list.Add(FillEntity(model, reader)); } if (_rootIncluder != null && list != null) { await _rootIncluder.LoadEntitySets(db, list, null); //TODO:fix txn } return(list); }
/// <summary> /// 返回树状结构的实体集合 /// </summary> /// <param name="childrenMember">例:q.T["SubItems"]</param> /// <returns></returns> public async Task <EntityList> ToTreeListAsync(MemberExpression childrenMember) { //TODO:目前实现仅支持单一主键且为Guid的树状结构 Debug.Assert(ReferenceEquals(childrenMember.Owner, T)); var children = (EntitySetExpression)childrenMember; EntityModel model = await RuntimeContext.Current.GetModelAsync <EntityModel>(T.ModelID); EntitySetModel childrenModel = (EntitySetModel)model.GetMember(children.Name, true); EntityRefModel parentModel = (EntityRefModel)model.GetMember(childrenModel.RefMemberId, true); DataFieldModel parentIdModel = (DataFieldModel)model.GetMember(parentModel.FKMemberIds[0], true); TreeParentIDMember = (FieldExpression)T[parentIdModel.Name]; var pk = model.SqlStoreOptions.PrimaryKeys[0].MemberId; AddAllSelects(this, model, T, null); //TODO:加入自动排序 //if (!string.IsNullOrEmpty(setmodel.RefRowNumberMemberName)) //{ // SqlSortItem sort = new SqlSortItem(T[setmodel.RefRowNumberMemberName], SortType.ASC); // SortItems.Insert(0, sort); //} //如果没有设置任何条件,则设置默认条件为查询根级开始 if (Equals(null, Filter)) { Filter = TreeParentIDMember == null; } Purpose = QueryPurpose.ToEntityTreeList; EntityList list = new EntityList(childrenModel); var db = SqlStore.Get(model.SqlStoreOptions.StoreModelId); var dic = new Dictionary <Guid, Entity>(); //TODO: fix pk using var cmd = db.BuildQuery(this); using var conn = db.MakeConnection(); await conn.OpenAsync(); cmd.Connection = conn; Log.Debug(cmd.CommandText); using var reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { Entity obj = FillEntity(model, reader); //设置obj本身的EntitySet成员为已加载,防止从数据库中再次加载 obj.InitEntitySetForLoad(childrenModel); var parentId = obj.GetGuidNullable(parentIdModel.MemberId); if (parentId.HasValue && dic.TryGetValue(parentId.Value, out Entity parent)) { parent.GetEntitySet(childrenModel.MemberId).Add(obj); } else { list.Add(obj); } dic.Add(obj.GetGuid(pk), obj); } return(list); }