2017-06-05 51 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