需求
有时候,我们在做项目得时候需要有个字典表,很多都是一个Table就算完事了,如果我们把他做成一个树会不会更好呢
先看EF得数据模型
public partial class Sys_Code
{
public string CodeText { get; set; }
public string CodeValue { get; set; }
public int Depth { get; set; }
public System.Guid Id { get; set; }
public Nullable<System.Guid> ParentId { get; set; }
public int Sort { get; set; }
}
#region 获取具有层次结构的系统参数表
/// <summary>
/// 说明:获取有层级的系统参数for treeview
/// </summary>
/// <returns>
/// json
/// </returns>
public string GetSysCodeForHierarchy(Guid parentId = new Guid())
{
RnDSuiteEntities DB = new RnDSuiteEntities();
List<Sys_Code> _codeList = DB.Sys_Code.ToList();
StringBuilder sb = new StringBuilder();
//增加根节点
List<Sys_Code> codes = new List<Sys_Code>();
if (parentId == Guid.Empty)
{
var rootCode = new Sys_Code
{
ParentId = Guid.NewGuid(),
Id = Guid.Empty,
CodeText = "测试一",
CodeValue = "测试一",
Depth = -1,
Sort = 0
};
codes.Add(rootCode);
var rootCodeGN = new Sys_Code
{
ParentId = Guid.NewGuid(),
Id = new Guid("00000000-0000-0000-0000-000000000001"),
CodeText = "测试二",
CodeValue = "测试二",
Depth = -1,
Sort = 0
};
codes.Add(rootCodeGN);
}
else
{
codes.AddRange(DB.Sys_Code.ToList());
}
sb.Append("[");
bool isFist = false;
foreach (Sys_Code item in codes)
{
if (isFist)
sb.Append(",");
isFist = true;
string id = item.Id.ToString();
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", id);
sb.AppendFormat("\"codetext\":\"{0}\",", item.CodeText.Replace(" ",""));
sb.AppendFormat("\"codevalue\":\"{0}\",", item.CodeValue);
sb.AppendFormat("\"parentid\":\"{0}\",", item.ParentId.ToString());
sb.AppendFormat("\"sort\":\"{0}\",", item.Sort);
sb.AppendFormat("\"depth\":\"{0}\",", item.Depth);
//sb.AppendFormat("\"hasChildren\":{0},", CheckChild(item.Id) ? 1 : 0);
sb.Append("\"Children\":[");
sb.Append(GetSubCode(new Guid(id), _codeList));
sb.Append("]");
sb.Append("}");
}
sb.Append("]");
return sb.ToString();
}
/// <summary>
/// 判断是否有子节点
/// </summary>
/// <param name="pid"></param>
/// <returns></returns>
private bool CheckChild(Guid parentid)
{
RnDSuiteEntities DB = new RnDSuiteEntities();
return DB.Sys_Code.Any(p => p.ParentId == parentid);
}
///
/// <summary>
/// 递归调用生成无限级别
/// </summary>
/// <param name="pid"></param>
/// <param name="navigationList"></param>
/// <returns></returns>
private string GetSubCode(Guid parentId, List<Sys_Code> codeList)
{
StringBuilder sb = new StringBuilder();
List<Sys_Code> codes = codeList.Where(p => p.ParentId == parentId).OrderBy(p => p.Sort).ToList();
if (codes.Count > 0)
{
bool isFist = false;
foreach (Sys_Code item in codes)
{
if (isFist)
sb.Append(",");
isFist = true;
string id = item.Id.ToString();
sb.Append("{");
sb.AppendFormat("\"id\":\"{0}\",", id);
sb.AppendFormat("\"codetext\":\"{0}\",", item.CodeText.Replace(" ", ""));
sb.AppendFormat("\"codevalue\":\"{0}\",", item.CodeValue);
sb.AppendFormat("\"parentid\":\"{0}\",", item.ParentId.ToString());
sb.AppendFormat("\"sort\":\"{0}\",", item.Sort);
sb.AppendFormat("\"depth\":\"{0}\",", item.Depth);
//sb.AppendFormat("\"hasChildren\":{0},", CheckChild(item.Id) ? 1 : 0);
sb.Append("\"Children\":[");
sb.Append(GetSubCode(new Guid(id), codeList));
sb.Append("]");
sb.Append("}");
}
}
return sb.ToString();
}