【问题标题】:Using LINQ to select hierarchical data?使用 LINQ 选择分层数据?
【发布时间】:2010-11-01 22:55:11
【问题描述】:

我在 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 进行大多数数据库访问)

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:
      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 连接?
      【解决方案3】:
      data.Select(d => d.Parent).Select(p => p.Property).ToList();
      

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

      【讨论】:

        【解决方案4】:
        var result = source.Select(child => new { 
         Child = child, 
         Parent = source.SingleOrDefault(parent => parent.ID == child.Parent)
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-05
          • 1970-01-01
          • 2013-06-12
          • 1970-01-01
          • 2016-06-26
          相关资源
          最近更新 更多