Files
g.hnyhua.cn/Mtxfw.Utility/DataAccess/Common.cs

100 lines
4.2 KiB
C#
Raw Normal View History

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
}
}