数据从一个表插入到另一表的层次结构格式

时间:2019-05-28 09:52:41

标签: c# sql linq common-table-expression

我在将记录从一个表插入到另一个表时遇到问题,因为表架构是相同的

Table 1     
Id  Parent Id   Text
11  Null          A
12  Null          B
13  11            C
14  11            D
15  13            E

记录应该以这种格式插入,我必须复制外键关系而不是它的身份。

Table 2     
Id  Parent Id   Text
31  Null         A
32  Null         B
33  31           C
34  31           D
35  33           E

2 个答案:

答案 0 :(得分:0)

Database方面可以轻松实现您想要的。 但是由于您正在寻找一种linq方法。这是可以实现的方法。

该过程分为两个部分:

希望您拥有Table1Table2的模型,例如(使用您认为有用的顺序。对于我来说,Table1是临时表):

Public class myEntity
{
  public int Id{get; set;}
  public int? ParentId{get; set;}
  public string Text{get; set;}
}

第一个:从Text复制所有Table A属性,并通过递增Table B

将它们插入IDs
var Table2 = new List<myEntity>();

Table1.Select(s=>s.Text).OrderBy(o=>o).ToList().ForEach(f=>
{
    //now append the texts to 
    Table2.Add(new tablesTest { Id = (Table2.Count + 1), Text = f });//remove the Id property manupulation or set it to 0 if you are inserting directly in the database and use the context.SaveChanges();(*if entity-framework*) once the insertion is complete.
}}

第二个:使用self-join创建映射表以获取Table1中条目之间的父子关系,然后更新Table2中的条目< / p>

var parentChildListFromTb1 = from m in Table1
                      join ch in Table1 on m.Id equals ch.ParentId
                      select new
                      {
                         Id = ch.Id,                             
                         Parent = m.Text,
                         Text = ch.Text
                      };

哪个会给您输出:

----------------------------
|  Id  |  Parent  |  Text  |
----------------------------
|  13  |    A     |    C   |
----------------------------
|  14  |    A     |    D   |
----------------------------
|  15  |    C     |    E   |
----------------------------

现在有了parent-child列表之后,我们现在通过查询Table2并用其受尊重的ID更新其ParentId来创建子列表:

parentChildListFromTb1.ForEach(f=>{
            var ChildEntity = Table2.Single(s => s.Text.Equals(f.Text));//fetching the child entity from Table2
            ChildEntity.ParentId = Table2.Single(s => s.Text.Equals(f.Parent)).Id;//updating the parentIds in Table2
});

Table2看起来像:

------------------------------
|  Id  |  ParentId  |  Text  |
------------------------------
|   1  |    null    |    A   |
------------------------------
|   2  |    null    |    B   |
------------------------------
|   3  |     1      |    C   |
------------------------------
|   4  |     1      |    D   |
------------------------------
|   5  |     3      |    E   |
------------------------------

答案 1 :(得分:0)

我已经找到了解决这个问题的方法。

步骤: 将Text列值插入到主表中,将ParentId保留为空,同时将这些值作为oldId键插入到Dictionary中,并将New Inserted Id作为对应键值插入到

中。

插入后,根据映射的字典keyValue对更新值