使用父ID过滤数据表

时间:2017-06-05 18:51:20

标签: c# linq datatable

enter image description here

我有一个数据表,它有两个字段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;
}

2 个答案:

答案 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;

}