2017-06-05 31 views
0

enter image description here过滤数据表使用父ID

我有一个数据表,它有2场FolderId,PARENT_ID。

我想筛选父项的所有子项并将其保存到另一个数据表中。 我能够使用两种方法和3个不同的循环实现这一点,没有一个更简单快捷的方式来实现这个使用Linq或什么的。

这里是我的代码

public DataTable ChildrenOf(string parent, DataTable dtFolders) 
{ 
    DataTable result = new DataTable(); 
    try 
    { 
     if (dtFolders != null) 
     { 
      result = dtFolders.Clone(); 
      foreach (DataRow child in dtFolders.Rows) 
      { 

       if (child["FolderId"].ToString() == parent) 
       { 
        result.Rows.Add(child.ItemArray); 
       } 
      } 
      foreach (DataRow dr in dtFolders.Rows) 
      { 
       if (ChildrenOfParent(parent, dtFolders) != null) 
       { 
        result.Rows.Add(ChildrenOfParent(parent, dtFolders).ItemArray); 
        parent = ChildrenOfParent(parent, dtFolders).ItemArray[0].ToString(); 
       } 
      } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
    return result; 
} 

public DataRow ChildrenOfParent(string parent, DataTable dtChild) 
{ 
    DataRow drChild; 
    drChild = null; 
    try 
    { 
     foreach (DataRow dr in dtChild.Rows) 
     { 
      if (dr["ParentId"].ToString() == parent) 
      { 
       drChild = dr; 
      } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 

    return drChild; 
} 
+0

我已经做了用递归方法之前,这个任务。我不知道你为什么想把结果放到数据表中。大多数时候最好的解决方案是放在树视图中。 Treeview提供了非常好的结果。 Linq不适用于递归代码。 – jdweng

回答

0

可以简化你的使用LINQ儿童搜索。类似这样的:

public DataTable ChildrenOf(string parent, DataTable dtFolders) 
{ 
    return dtFolders.AsEnumerable() 
     .Where(row => row.Field<String>("FolderId") == parent) 
     .CopyToDataTable(); 
} 

我使用了与您的示例相同的方法签名。只需使用原始表格和父代码调用方法即可。方法将返回新的过滤表。

+0

这只返回第一行不是父母的所有子行 – user3178955

+0

@ user3178955我已经用一些虚拟数据测试过它,它正在按照它的设计工作。请提供表格结构和/或样本数据,以便我可以进一步测试 – Nino

+0

在问题部分添加了表格结构部分 – user3178955

0

try代码

public DataTable ChildrenOf(string parent, DataTable dtFolders) 
{ 
    DataTable result = new DataTable(); 
    try 
    { 
     if (dtFolders != null) 
     { 
      result = dtFolders.Clone(); 
      foreach (DataRow child in dtFolders.Rows) 
      { 

      if (child["FolderId"].ToString() == parent) 
      { 
       result.Rows.Add(child.ItemArray); 
      } 

      if (child ["ParentId"]!=null && child ["ParentId"].ToString() == parent) 
      { 
       result.Rows.Add(child.ItemArray); 
       parent =child.ItemArray.ToString(); 
      } 

     } 

    } 
} 
catch (Exception) 
{ 
    throw; 
} 
return result; 

} 
+0

如果父行的孩子不是连续的序列,这将不会过滤 – user3178955