100 lines
4.2 KiB
C#
100 lines
4.2 KiB
C#
using System;
|
|
using System.Data;
|
|
using System.Linq.Expressions;
|
|
|
|
namespace Mtxfw.Utility.DataAccess
|
|
{
|
|
public partial class Sql :DbHelperSqlSugar
|
|
{
|
|
#region 分类迭代
|
|
/// <summary>
|
|
/// 迭代查询
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="predicate">查询条件 linq语句</param>
|
|
/// <param name="parent_id">上级ID</param>
|
|
/// <param name="channel_id">频道ID</param>
|
|
/// <param name="isLevel">是否添加等级字段 (class_layer)</param>
|
|
/// <param name="orderBy">排序</param>
|
|
/// <param name="parent_field">上级字段名称 (如:parent_id)</param>
|
|
/// <param name="strWhere">其他条件</param>
|
|
/// <returns></returns>
|
|
public DataTable Iteration<T>(Expression<Func<T, bool>> 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<T>().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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从内存中取得所有下级类别列表(自身迭代)
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 从内存中取得所有下级类别列表(自身迭代)
|
|
/// </summary>
|
|
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
|
|
}
|
|
}
|