我有一个数据表,它有两个字段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 :(得分:0)
您可以使用Linq简化对孩子的搜索。像这样:
public DataTable ChildrenOf(string parent, DataTable dtFolders)
{
return dtFolders.AsEnumerable()
.Where(row => row.Field<String>("FolderId") == parent)
.CopyToDataTable();
}
我在你的例子中使用了相同的方法签名。只需使用原始表和父ID调用方法。方法将返回新的过滤表。
答案 1 :(得分:0)
尝试代码
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;
}