PDA

View Full Version : داده های سلسله مراتبی در LINQ



رضا عربلو
جمعه 07 تیر 1387, 04:01 صبح
می خواهم در ی جدول Hirechical تمام فرزندان ممکن یک Node را بدست آورم.
البته این کار را می توان با استفاده از Recursion CTE انجام داد (که من نمی خواهم به هیچ عنوان به دیتابیس وصل شوم و تنها با داده های موجود در DataTable ام سرو کار دارم.)
و همانطور که در کد پایین نشان خواهم داد با استفاده از Recursion نیز می توان انجام داد.

ولی این سوال برایم مطرح است که آیا بدون وصل شدن به دیتابیس و تنها با استقاده از LINQ و Extensionهایش می توان داده های سلسله مراتبی را استخراج کرد. یک چیز Pure می خواهم که در چند خط نتیجه مورد نظر من را بهم بدهد . از دوستان کسی تجره به ای در این ضمینه ندارد.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void ShowDataTableContents(DataTable dt)
{
Console.WriteLine(" ID ParentID Caption ");
Console.WriteLine("-------------- --------------------- ---------------------");
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
Console.Write(dt.Rows[i][j].ToString().PadRight(20));
}
Console.WriteLine();
}
}
static System.Data.EnumerableRowCollection<DataRow> GetChild(DataTable dt, int id)
{
System.Data.EnumerableRowCollection<DataRow> dr1 = from g in dt.AsEnumerable() where (g["ParentID"].ToString() == id.ToString()) select g;
System.Data.EnumerableRowCollection<DataRow> dr3 = dr1;
if (dr1.Count() != 0)
{
System.Data.EnumerableRowCollection<DataRow> dr2 = dr1;
foreach (DataRow r in dr1)
{
dr2 = GetChild(dt, System.Convert.ToInt32(r["ID"]));
dr3 = dr3.Union(dr2).CopyToDataTable().AsEnumerable();
}
return dr3;
}
else
{
return dr3;
}

}
static void Main(string[] args)
{
try
{
DataTable dt = new DataTable();
DataColumn dc1 = dt.Columns.Add("ID", Type.GetType("System.Int32"));
dt.PrimaryKey = new DataColumn[] { dc1 };
DataColumn dc2 = dt.Columns.Add("ParentID", Type.GetType("System.Int32"));
dc2.AllowDBNull = true;
dt.Columns.Add("Caption", Type.GetType("System.String"));
dt.Rows.Add(new object[] { 1, System.Convert.DBNull, "Node 1, null" });
dt.Rows.Add(new object[] { 2, 1, "Node 2, 1" });
dt.Rows.Add(new object[] { 3, 1, "Node 3, 1" });
dt.Rows.Add(new object[] { 4, 2, "Node 4, 2" });
dt.Rows.Add(new object[] { 5, 2, "Node 5, 2" });
dt.Rows.Add(new object[] { 6, System.Convert.DBNull, "Node 6, null" });
ShowDataTableContents(dt);
Console.WriteLine();
Console.WriteLine("--------- Method 1 (using Recursive function AND LinQ) ---------------");
Console.WriteLine();
foreach (var r in GetChild(dt, 1))
{
for (int j = 0; j < dt.Columns.Count; j++)
{
Console.Write(r[j].ToString().PadRight(20));
}
Console.WriteLine();
}

Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
}
}