Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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
从SQL查询(存储过程)映射到C#类结构_C#_Sql_Orm - Fatal编程技术网

从SQL查询(存储过程)映射到C#类结构

从SQL查询(存储过程)映射到C#类结构,c#,sql,orm,C#,Sql,Orm,我有一个存储过程,它以以下格式返回数据: public class Sp_Class { public int ItemId { get; set; } public int ParentID { get; set; } } 4 2 5 6 它将返回以下数据: ItemId ParentID 1-空 2-1 3-1 4-2 5-2 6-2 7-3 8-3 9-3 现在,我想将其组织为以下递归类结构: public class MappedS

我有一个存储过程,它以以下格式返回数据:

public class Sp_Class
{
    public int ItemId { get; set; }

    public int ParentID { get; set; }
}
    4
2   5
    6       
它将返回以下数据:

ItemId ParentID

1-空

2-1

3-1

4-2

5-2

6-2

7-3

8-3

9-3

现在,我想将其组织为以下递归类结构:

public class MappedStructure
{
    public int ItemId { get; set; }

    public List<MappedStructure> Children { get; set; }
}
一,

    7
3   8
    9
我知道我可以编写一个函数来实现这一点,但我觉得应该已经有工具可以实现这一点了——例如,项目的其余部分使用实体框架,而实体框架已经做到了这一点。我相信ORM就是这么做的


请注意,对于这个特定的查询,我不能使用Entity,但这超出了本文讨论的范围。

下面是一个关于如何使用LINQ执行此操作的示例。首先是一个sampe数据表。我假设顶级项的父ID为Null

var dataTable = new DataTable();
// Call Sp and fill data in DataTale
表示每个数据项的类:

class Item {

  public Int32 ItemId { get; set; }

  public String Name { get; set; }

  public IEnumerable<Item> Children { get; set; }

}

下面是一个关于如何使用LINQ实现这一点的示例。首先是一个sampe数据表。我假设顶级项的父ID为Null

var dataTable = new DataTable();
// Call Sp and fill data in DataTale
表示每个数据项的类:

class Item {

  public Int32 ItemId { get; set; }

  public String Name { get; set; }

  public IEnumerable<Item> Children { get; set; }

}

谢谢你,这当然是个好答案,但我正在寻找一个能为我做到这一点的图书馆,如果有的话?@Alex,我不这么认为。我什么也没找到。谢谢你,这肯定是一个很好的答案,但我正在寻找一个能为我做到这一点的图书馆,如果有的话?@Alex,我不这么认为。我什么也没找到。
IEnumerable<DataRow> GetTopLevelRows(DataTable dataTable) {
  return dataTable
    .Rows
    .Cast<DataRow>()
    .Where(row => row.Field<Int32>("ParentID") == null);
}
var items = GetTopLevelRows(dataTable)
  .Select(row => CreateItem(dataTable, row))
  .ToList();