.NET 2.0(はい、2.0)アプリケーションに階層データを入力しようとしていますが、現在のアップグレードはテーブルから外れています(したがって、LINQ、LINQ Bridgeなどはありません)。
このクラス構造に階層データを取り込むためのより良い方法があるかどうか疑問に思いましたか?これを達成するためのはるかに良い方法があると私はかなり確信しています。
これを行うための良い方法を見るのは本当に素晴らしいことです。誰かが.NET2.0の方法を示す時間があり、別の方法がある場合は、.NET4.0以降でそれを行うのは素晴らしいことです。
ノードタイプ構造の例を次に示します。
using System.Collections.Generic;
public class ExampleNode
{
private int _id;
private Nullable<int> _parentId;
private int _depth;
private List<ExampleNode> _children = new List<ExampleNode>();
public ExampleNode()
{
}
public virtual int ApplicationNumber {
get { return _id; }
set { _id = value; }
}
public virtual Nullable<int> ParentId {
get { return _parentId; }
set { _parentId = value; }
}
public virtual int Depth {
get { return _depth; }
set { _depth = value; }
}
public virtual List<ExampleNode> Children {
get { return _children; }
set { _children = value; }
}
}
これは、ノード構造を設定するために使用されている関数の例です。これを行うのは最善の方法ではないようで、孫タイプのデータを入力しない可能性があります。深さは、階層内のレベルとしてストアドプロシージャから返されます(レベル0のアイテムはトップレベルであり、ノードがトップレベルノードの子である場合はレベル1であり、トップレベルノードの孫はレベルです) 2など)
public List<ExampleNode> GetNodes()
{
// This may not be optimal.
List<ExampleNode> nodeList = new List<ExampleNode>();
Dictionary<int, ExampleNode> nodeDictionary = new Dictionary<int, ExampleNode>();
using (SqlDataReader reader = SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings("SqlServer").ConnectionString, CommandType.StoredProcedure, "proc_GetNodeStructure", new SqlParameter("@UserId", userId), new SqlParameter("@NodeTypeId", nodeType))) {
while (reader.Read) {
ExampleNode nodeInstance = new ExampleNode();
nodeInstance.Id = Convert.ToInt32(reader("Id"));
nodeInstance.Depth = Convert.ToInt32(reader("Depth"));
if (!Information.IsDBNull(reader("ParentId"))) {
nodeInstance.ParentId = Convert.ToInt64(reader("ParentId"));
}
// Add to list
nodeList.Add(nodeInstance);
// Add to dictionary
nodeDictionary.Add(nodeInstance.Id, nodeInstance);
}
}
foreach (ExampleNode item in nodeList) {
if (item.ParentId.HasValue) {
nodeDictionary(item.ParentId).Children.Add(item);
}
}
for (int i = nodeList.Count - 1; i >= 0; i += -1) {
if (nodeList(i).Depth > 0) {
nodeList.RemoveAt(i);
}
}
return nodeList;
}