/// <summary> /// 查询,按照所有不为空的条件查询 /// </summary> /// <param name="Filter">查询类</param> /// <param name="TInfo">返回类型</param> /// <param name="TFilter">查询类型</param> /// <returns></returns> public List <TableEntityBase> SelectList(TableEntityBase Filter, Type TInfo, Type TFilter) { List <TableEntityBase> res = new List <TableEntityBase>(); TableEntityBase refinfo = TableEntityBase.Create(TInfo); PropertyInfo[] Allprop = Filter.GetAllSelectField().Where(a => { return(a.GetValue(Filter, null) != null); }).ToArray(); IDbDataParameter[] dbprams = Allprop.Select(a => { IDbDataParameter p = GetDbDataParameter(a, Filter); return(p); }).ToArray(); RunSql(_dbCommand => { _dbCommand.Parameters.Clear(); _dbCommand.Parameters.AddRange(dbprams); string tablename = refinfo.GetTableName(); string select = string.Join(",", refinfo.GetAllField().Select(a => GetFieldName(a.Name))); string where = string.Join(" and ", Allprop.Select(a => a.Name + "=" + GetPramCols(a.Name))); _dbCommand.CommandText = string.Format(_select, select, tablename, where.IsEmpty(" 1=1 ")); using (DbDataReader reader = _dbCommand.ExecuteReader()) { res = this.ReaderToEntity(TInfo, reader).ToList(); } }); res.ForEach(a => a = _SelectChildren(a)); return(res); }
void _DeleteChildren(TableEntityBase info) { PropertyInfo[] ForeignKeys = info.GetForeignKey(); if (!ForeignKeys.IsEmpty()) //有子表,处理子表 { ForeignKeys.ForEach(key => //主表里记录子表的列表 { if (key.IsArray() && key.GetChildren().BaseOn <TableEntityBase>()) { List <ForeignKeyAttribute> attrs = key.GetAttributes <ForeignKeyAttribute>(); TableEntityBase edel = TableEntityBase.Create(key.GetChildren()); attrs.ForEach(attr => { edel.GetType().GetProperty(attr.ChildrenKey).SetValue(edel, info.GetPropertyValue(attr.ParentKey), null); }); _DeleteChildren(edel); DeleteList(edel); } else { throw new Exception($"属性{key.Name}必须是EntityBase的广义数组"); } }); } }
T _SelectChildren <T>(T info) where T : TableEntityBase { if (info == null) { return(info); } PropertyInfo[] ForeignKeys = info.GetForeignKey(); if (!ForeignKeys.IsEmpty()) //有子表,处理子表 { ForeignKeys.ForEach(key => //主表里记录子表的列表 { if (key.IsArray() && key.GetChildren().BaseOn <TableEntityBase>()) { Type t = key.GetChildren(); TableEntityBase item = TableEntityBase.Create(t); List <ForeignKeyAttribute> attrs = key.GetAttributes <ForeignKeyAttribute>(); attrs.ForEach(a => { item.SetPropertyValue(a.ChildrenKey, info.GetPropertyValue(a.ParentKey)); }); List <TableEntityBase> res = SelectList(item, t); key.SetArrValue(info, res); } else { throw new Exception($"属性{key.Name}必须是EntityBase的广义数组"); } }); } return(info); }
/// <summary> /// 读取的内容转换为Entity /// </summary> /// <param name="reader"></param> /// <returns></returns> /// private List <TableEntityBase> ReaderToEntity(Type t, DbDataReader reader) { List <TableEntityBase> res = new List <TableEntityBase>(); int fieldCount = reader.FieldCount; while (reader.Read()) { TableEntityBase entity = TableEntityBase.Create(t); for (int i = 0; i < fieldCount; i++) { entity.SetPropertyValue(reader.GetName(i), reader.GetValue(i)); } res.Add(entity); } reader.Close(); return(res); }