代码之家  ›  专栏  ›  技术社区  ›  pavanred

有没有更好的方法:连接不同的数据表?

  •  2
  • pavanred  · 技术社区  · 15 年前

    JOIN 在数据集中的两个数据表上。例如,我正在处理AdventureWorks数据库。我需要表格里的数据 [Person].[Address] [Person].[StateProvince] 一旦数据在相应的数据表中,我就必须执行 加入 StateProvinceID 列。

    Address {Address,A_StateID}
    State {S_StateID,Name}
    

    我在互联网上的搜索让我找到了很多例子,这些例子说我必须使用Datarelation对象才能执行 . 我发现的例子是-

    DataColumn childcolumn = dsAdd.Tables["Address"].Columns["A_StateID"];
    DataColumn parentcolumn = dsAdd.Tables["State"].Columns["S_StateID"];
    DataRelation relStateID = new DataRelation("StateRel", parentcolumn, childcolumn,false);
    dsAdd.Relations.Add(relStateID);
    

    但是,我不知道在添加一个DataRelation来执行 . 所以,我决定自己动手-

        //I added a new column to my Address table obtain the State Name after performing the `JOIN`
        DataColumn A_State = new DataColumn("State");
        A_State.DataType = typeof(string);
        dsAdd.Tables["Address"].Columns.Add(A_State);
    
        foreach (DataRow dr in dsAdd.Tables["Address"].Rows)
        {           
            //for each row in the Address table I obtain the StateID
            string stateid = dr.ItemArray[1].ToString();
            string expression = "S_StateID =" + stateid;
    
            //Obtain the corresponding row from State table and update the value in new column in Address table 
            DataRow[] newdr;
            newdr = dsAdd.Tables["State"].Select(expression);
            string statename = newdr[0].ItemArray[1].ToString();
            dr.SetField("State", statename.ToString());
        }
    
        grdJoins.DataSource = dsAdd.Tables["Address"];
        grdJoins.DataBind();
    

    加入

    2 回复  |  直到 15 年前
        1
  •  3
  •   Joel Coehoorn    15 年前

    这个 最好的 方法是在数据库上执行。连接是相对昂贵和缓慢的操作;数据库作为独立于表集合的实体存在有两个原因:强制执行安全的并发访问和 他们使用各种技巧,如索引、物化视图、缓存等,以确保大部分繁重的工作已经为您完成。

    grdJoins.DataSource = dsAdd.Tables["Address"].AsEnumerable()
                    .Join(dsAdd.Tables["State"].AsEnumerable(),
            add => add["A_StateID"], st => st["S_StateID"],
            (add, st) => new 
          { 
              Address = add["Address"],
              City = add["City"],
              StateProvince = add["StateProvince"],
              State = st["State"]
          });
    
    grdJoins.DataBind();
    
        2
  •  0
  •   Roman    15 年前

    如果我能正确理解你的问题,一旦你添加了 DataRelation GetChildRows 在给定的行上获取 加入