C# 使用父id筛选数据表
我有一个数据表,它有两个字段FolderId,Parent_Id 我想筛选父项的所有子项并将其保存到另一个数据表中。 我可以用两种方法和3种不同的循环来实现这一点,难道没有一种更简单、更快速的方法来实现这一点吗 这是我的密码C# 使用父id筛选数据表,c#,linq,datatable,C#,Linq,Datatable,我有一个数据表,它有两个字段FolderId,Parent_Id 我想筛选父项的所有子项并将其保存到另一个数据表中。 我可以用两种方法和3种不同的循环来实现这一点,难道没有一种更简单、更快速的方法来实现这一点吗 这是我的密码 public DataTable ChildrenOf(string parent, DataTable dtFolders) { DataTable result = new DataTable(); try { if (dtFo
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;
}
您可以使用Linq简化对孩子的搜索。大概是这样的:
public DataTable ChildrenOf(string parent, DataTable dtFolders)
{
return dtFolders.AsEnumerable()
.Where(row => row.Field<String>("FolderId") == parent)
.CopyToDataTable();
}
public DataTable ChildrenOf(字符串父项,DataTable dtFolders)
{
返回dtFolders.AsEnumerable()
.Where(row=>row.Field(“FolderId”)==parent)
.CopyToDataTable();
}
我使用了与您示例中相同的方法签名。只需使用原始表和父ID调用方法。方法将返回新的筛选表。请尝试代码
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;
}
在使用递归方法之前,我已经完成了这个任务。我不知道为什么要将结果放入数据表中。大多数情况下,最好的解决方案是放在树视图中。Treeview提供了非常好的结果。Linq不处理递归代码。它只返回第一行,而不是所有子行parent@user3178955我用一些虚拟数据对它进行了测试,它按预期工作。请提供表结构和/或示例数据,以便我可以进一步测试它。在问题部分添加了表结构。如果父行的子行不是连续序列,则不会进行筛选