首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从SQL查询(存储过程)映射到C#类结构

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

Stack Overflow用户
提问于 2018-08-22 09:03:21
回答 1查看 426关注 0票数 0

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

代码语言:javascript
运行
复制
public class Sp_Class
{
    public int ItemId { get; set; }

    public int ParentID { get; set; }
}

它将返回以下数据:

ItemId-ParentID

1-空

2-1

3-1

4-2

5-2

6-2

7-3

8-3

9-3

我现在想将它组织成以下递归类结构:

代码语言:javascript
运行
复制
public class MappedStructure
{
    public int ItemId { get; set; }

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

它将把数据转换成以下格式:

代码语言:javascript
运行
复制
    4
2   5
    6       

1

代码语言:javascript
运行
复制
    7
3   8
    9

我知道我可以编写一个函数来完成这个任务,但是我觉得应该已经有了一些工具来完成这个任务--例如,项目的其他部分已经使用了实体框架来完成这个任务。我相信这就是ORM所做的?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 09:11:33

下面是一个关于如何使用LINQ实现该操作的示例。首先是。我假设顶级项具有Null的父ID。

代码语言:javascript
运行
复制
var dataTable = new DataTable();
// Call Sp and fill data in DataTale

表示每一项数据的类:

代码语言:javascript
运行
复制
class Item {

  public Int32 ItemId { get; set; }

  public String Name { get; set; }

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

}

获取某一特定项目的子级的函数:

代码语言:javascript
运行
复制
IEnumerable<DataRow> GetChildren(DataTable dataTable, Int32 parentId) {
  return dataTable
    .Rows
    .Cast<DataRow>()
    .Where(row => row.Field<Int32>("ParentID") == parentId);
}

用于创建包含子集合的项的函数。此函数将恢复层次结构:

代码语言:javascript
运行
复制
Item CreateItem(DataTable dataTable, DataRow row) {
  var id = row.Field<Int32>("ItemId");
  var name = row.Field<String>("Name");
  var children = GetChildren(dataTable, id)
    .Select(r => CreateItem(dataTable, r))
    .ToList();
  return new Item { ItemId = id, Name = name, Children = children };
}

获取顶级项的行的函数:

代码语言:javascript
运行
复制
IEnumerable<DataRow> GetTopLevelRows(DataTable dataTable) {
  return dataTable
    .Rows
    .Cast<DataRow>()
    .Where(row => row.Field<Int32>("ParentID") == null);
}

把这一切结合在一起:

代码语言:javascript
运行
复制
var items = GetTopLevelRows(dataTable)
  .Select(row => CreateItem(dataTable, row))
  .ToList();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51963296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档