Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用父id筛选数据表_C#_Linq_Datatable - Fatal编程技术网

C# 使用父id筛选数据表

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

我有一个数据表,它有两个字段FolderId,Parent_Id

我想筛选父项的所有子项并将其保存到另一个数据表中。 我可以用两种方法和3种不同的循环来实现这一点,难道没有一种更简单、更快速的方法来实现这一点吗

这是我的密码

 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我用一些虚拟数据对它进行了测试,它按预期工作。请提供表结构和/或示例数据,以便我可以进一步测试它。在问题部分添加了表结构。如果父行的子行不是连续序列,则不会进行筛选