使用LINQ选择分层数据?

3

我在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个回答

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

你的LINQ语句是一个无操作...为什么不使用LINQ join呢? - Timothy Baldridge

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

select 语句只会将结果懒加载返回给您。因此,只需选择所需内容并将其放入本地列表中,或者使用一些语法,您可以使用匿名投影将所有数据级别捆绑在一起,并在 .ToList() 返回之前对其进行过滤。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接