using System; using System.Data; using System.Linq.Expressions; namespace Mtxfw.Utility.DataAccess { public partial class Sql :DbHelperSqlSugar { #region 分类迭代 /// /// 迭代查询 /// /// /// 查询条件 linq语句 /// 上级ID /// 频道ID /// 是否添加等级字段 (class_layer) /// 排序 /// 上级字段名称 (如:parent_id) /// 其他条件 /// public DataTable Iteration(Expression> predicate, int parent_id = 0, int channel_id = 0, bool isLevel = false, string orderBy = "id desc", string parent_field = "parent_id", string strWhere = "") where T : class, new() { DataTable dt = Db.Queryable().Where(predicate) .WhereIF(channel_id > 0, "channel_id=" + channel_id) .Where(strWhere) .OrderBy(orderBy).ToDataTable(); //复制结构 DataTable newData = dt.Clone(); if (isLevel) { newData.Columns.Add("class_list", typeof(string)); newData.Columns.Add("class_layer", typeof(int)); GetChildsLayer(dt, newData, parent_field, parent_id, "", 0); } else { GetChilds(dt, newData, parent_field, parent_id, channel_id); } //调用迭代组合成DAGATABLE return newData; } /// /// 从内存中取得所有下级类别列表(自身迭代) /// public void GetChilds(DataTable oldData, DataTable newData, string parent_field, int parent_id, int channel_id) { DataRow[] dr = oldData.Select(parent_field + "=" + parent_id); for (int i = 0; i < dr.Length; i++) { DataRow row = newData.NewRow();//创建新行 //循环查找列数量赋值 for (int j = 0; j < dr[i].Table.Columns.Count; j++) { row[dr[i].Table.Columns[j].ColumnName] = dr[i][dr[i].Table.Columns[j].ColumnName]; } newData.Rows.Add(row); //调用自身迭代 this.GetChilds(oldData, newData, parent_field, int.Parse(dr[i]["id"].ToString()), channel_id); } } /// /// 从内存中取得所有下级类别列表(自身迭代) /// private void GetChildsLayer(DataTable oldData, DataTable newData, string parent_field, int parent_id, string str_ids, int class_layer) { class_layer++; DataRow[] dr = oldData.Select(parent_field + "=" + parent_id); for (int i = 0; i < dr.Length; i++) { DataRow row = newData.NewRow();//创建新行 //循环查找列数量赋值 string strId = ""; string strClassList = ""; for (int j = 0; j < dr[i].Table.Columns.Count; j++) { row[dr[i].Table.Columns[j].ColumnName] = dr[i][dr[i].Table.Columns[j].ColumnName]; if ("id".Equals(dr[i].Table.Columns[j].ColumnName)) { strId = dr[i][dr[i].Table.Columns[j].ColumnName].ToString(); } if ("class_list".Equals(dr[i].Table.Columns[j].ColumnName)) { strClassList = dr[i][dr[i].Table.Columns[j].ColumnName].ToString(); } } row["class_list"] = strClassList + "," + strId; row["class_layer"] = class_layer;//赋值深度字段 newData.Rows.Add(row);//添加新行 //调用自身迭代 this.GetChildsLayer(oldData, newData, parent_field, int.Parse(dr[i]["id"].ToString()), str_ids, class_layer); } } #endregion } }