使用LINQ选择分层数据?

时间:2010-11-01 22:55:11

标签: .net sql-server linq linq-to-sql hierarchical-data

我在SQL Server中有一个表格结构如下:

id  Name  Parent
--  ----  ------
1   foo   null
2   bar   1
3   oof   null
4   rab   3
.
.
.

我需要将两个关联行中的数据作为.NET DataTable中的一行。我想要的DataTable看起来像这样:

Parent  Child
------  -----
foo     bar
oof     rab

我能够使用以下查询完成此操作:

with temp as
(
  SELECT 1 id,'foo' name, null parent
  UNION
  select 2,'bar', 1
  UNION
  SELECT 3,'oof', null
  UNION
  select 4,'rab', 3
)

SELECT t1.name parent, t2.name child
FROM temp t1
INNER JOIN temp t2
ON t1.id = t2.parent

但我很好奇是否有一种简单的方法可以使用LINQ来做到这一点? (我们的商店使用LINQ进行大多数数据库访问)

4 个答案:

答案 0 :(得分:2)

我更喜欢将连接保持为连接

var result = from t1 in table
join t2 in table on t1.id = t2.parent
select new { parent = t1.name, child = t2.name }

答案 1 :(得分:1)

DataTable dt = new DataTable()
//Other DT stufff

//LINQ Query
var data = from t in table
           select t;

//Loop to create DT
foreach (item in data.ToList())
{
    DataRow dr = new DataRow();
    dr["Parent"] = item.Name;
    dr["Child"] = item.item.Name; //Where item.item is your FK relation to itself
    dt.Rows.Add(dr);
}

答案 2 :(得分:0)

data.Select(d => d.Parent).Select(p => p.Property).ToList();

select会将结果投影回懒惰加载。如此简单地将您需要的内容选择到本地列表中,或者使用一点语法,您可以使用匿名投影将所有级别的数据组合在一起并在之前对其进行过滤.ToList()返回到ya。

答案 3 :(得分:0)

var result = source.Select(child => new { 
 Child = child, 
 Parent = source.SingleOrDefault(parent => parent.ID == child.Parent)
});