首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何链接父ids和子ids?

如何链接父ids和子ids?
EN

Stack Overflow用户
提问于 2014-04-14 13:02:11
回答 2查看 479关注 0票数 0

我有下表

代码语言:javascript
复制
PNLParentId  id         operator 

12           13         *
12           14         *
12           15         *

20           1          -
20           2          -

13           21         /
13           20         /

我已经创建了一个foreach循环,在这个循环中,我获取了行并将另一个数据集添加到dataset.Then中,对于那些是children...but的数据集,现在如何链接它们??

代码语言:javascript
复制
String dbConnection = "Data Source=test;Initial Catalog=test;Integrated Security=SSPI;";
String myCommand = "SELECT PNLParentId , Operator FROM [test].[dbo].[DimPNL] GROUP BY PNLParentId,Operator";

DataSet ds = GetDataSet(myCommand, dbConnection);
using (SqlConnection connection = new SqlConnection(dbConnection))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand(myCommand, connection))
    {
        DataSet ds1 = new DataSet();
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(command);
        da.Fill(ds1, "test");
        dt = ds1.Tables["test"];

        foreach (DataRow dr in dt.Rows)
        {
            using (SqlCommand command1 = new SqlCommand("SELECT PNLId FROM [test].[dbo].[DimPNL]  WHERE @PNLParentId =PNLParentId and @Operator=Operator" , connection))
            {
                command1.Parameters.Add(
                    new SqlParameter(
                        "@PNLParentId", dr["PNLParentId"].ToString()));

                command1.Parameters.Add(
                    new SqlParameter(
                        "@Operator", dr["Operator"].ToString()));

                DataSet ds2 = new DataSet();
                DataTable dt1 = new DataTable();
                SqlDataAdapter da1 = new SqlDataAdapter(command1);
                da1.Fill(ds2, "test1");
                dt1 = ds2.Tables["test1"];

                foreach (DataRow dr1 in dt1.Rows)
                {
                    Console.WriteLine(dr1["PNLId"].ToString());
                }
            }
        } 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-14 14:32:09

这类问题通常最好在对象级别解决。例如,假设你有目标

代码语言:javascript
复制
class Node {
  public int Id { get; set; }
  public int? ParentId { get; set; }
  public string Operator { get; set; }
  public Node Parent { get; set; }
  public IList<Node> Children { get; set; }
  public Node() {
    Children = new List<Node>();
  }
}

然后执行两个迭代-一个用于加载数据,一个用于分配父/子层次结构。

代码语言:javascript
复制
  // dt1 is something with all rows with columns Id, ParentId, Operator together
  DataTable dt1 = null;

  var map = new Dictionary<int, Node>();
  var rootNodes = new List<Node>();
  foreach(DataRow row in dt1.Rows) {
    int id = Convert.ToInt32(row["Id"]);
    int? parentId = null;
    if (!row.IsNull("ParentId")) {
      parentId = Convert.ToInt32(row["ParentId"]);
    }
    string op = Convert.ToString(row["Operator"]);
    map[id] = new Node {
      Id = id,
      ParentId = parentId,
      Operator = op
    };
  }
  foreach (var pair in map) {
    if (pair.Value.ParentId.HasValue) {
      var parent = map[pair.Value.ParentId.Value];
      pair.Value.Parent = parent;
      parent.Children.Add(pair.Value);
    } else {
      rootNodes.Add(pair.Value);
    }
  }
票数 0
EN

Stack Overflow用户

发布于 2014-04-14 13:31:15

可以使用@@SCOPE_IDENTITY()读取最后插入的标识值。只需在每个父母插入后阅读这些内容,并在插入孩子时使用它们。

但是,我没有看到您在代码中插入任何内容,所以这可能不是您要寻找的。如果你只对阅读现成的数据感兴趣,那么.

没有使用SqlCommand等的自动解决方案。简单的方法是使用例如字典来保存父项,并根据其父ID将子元素添加到这些项中。

或者您可以简单地切换到例如EntityFramework,让它为您完成以下工作:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23060828

复制
相关文章

相似问题

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