【问题标题】:How to join tables for migration in C#?如何在 C# 中连接表以进行迁移?
【发布时间】:2017-05-01 01:11:49
【问题描述】:

我有old db,我正在将信息转移到new db。 所以我需要创建表Hospitals,其中包含来自hospitals1hospitals2 的信息

 using (var oldDb = new oldBAEntity())
 {
     using (var newDb = new NewDbContextEntities())
     {
         var queryHospitals = oldDb.Hospitals.Join(Hospitals2)
     }
 }

我的问题是在 c# 中加入是如何工作的。我需要根据来自医院的IdCode 获取一列信息。

【问题讨论】:

  • 有些事情不清楚:1)两个表都在同一个数据库中吗?如果不是,则加入将不起作用,因为每个数据库都有一个上下文。 2)您有哪些列以及执行连接的关键列(那些包含有关医院的唯一信息的列)。
  • 在新数据库中我们有表医院,在旧数据库中我们有表医院1 和医院2。我需要从 hospital1 中取出所有列,并将它们放入新 db 中新表 Hospitals 中的新 db + 列 Settlement 中。 Hospitals1 的 Idcode 列是与表 Hospitals2 的引用,以便获取结算记录。
  • 医院包含:id、医院名称、医院地址和结算ID 我们从医院1 获取id,从医院1 获取医院名称,从医院1 获取医院地址,我们需要从医院2 获取结算ID
  • 好的。您应该将oldBAEntity 中的所有医院放入 RAM (ToList()),并对 NewDbContextEntities() 中的医院执行相同操作。然后在内存中执行 jois 并将结果添加到新数据库中。
  • @sprinter252 嗯,我没听懂你的意思。我正在创建 List (这是一个类型为 newDB 的列表。我从 olddb 中获取来自 hospital1 的所有信息并将其记录在例如 var query1 = olddb.hospitals1 中,但我如何加入hospital2.settlementid 基于记录的 IdCode?应该是 Hospitals1.IdCode = Hospitals2.IdCode。在 sql 中查询非常简单:SELECT * FROM Hospital1 Join Hospital2.SettlementID ON Hospital1.IdCode = Hospital2.IdCode 但我不知道如何在 C# 中做到这一点

标签: c# sql-server database join


【解决方案1】:

我不确定我在 cmets 中看到的所有内容是否正确。据我了解,这应该可行

void Main()
{
    List<Hospital> oldList;
    List<Hospital> newList;

    using (var oldDb = new oldBAEntity())
    {
        oldList=  oldDb.Hospitals.ToList();         
    }
    using (var newDb = new NewDbContextEntities())
    {
        newList = newDb.Hospitals.ToList();
    }

    var joined = oldList.Join(newList, 
        old => old.Id, 
        oldItem => oldItem.Id, 
        (old, newItem) => new 
            { 
                NewId = newItem.Id, 
                NewName = newItem.Name, 
                // do whatever you have to do instead of this
                OldSettlementId = old.SettlementId
        });

    using (var newDb = new NewDbContextEntities())
    {
        // perform your update using the joined here
    }
}

class Hospital
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string SettlementId  { get; set; }
}

你必须根据你给定的类型来调整它。

【讨论】:

  • 现在我明白你的意思了!我在我创建的解决方案下方发布。我认为它更容易和更容易理解。 :)
【解决方案2】:
I found out other way to do it. I think it's very simple and well constructed ! 
using (var oldDb = new oldBAEntity())
        {
            using (var newDb = new NewDbContextEntities())
            {
                var queryHospitals_ = oldDb.N_Hospital_;
                var queryHospitals = oldDb.N_Hospital;
                List<Hospital> listHospital = new List<Hospital>();

                var joinResult = (from t1 in queryHospitals_
                                  join t2 in queryHospitals on t1.IdCode equals t2.IdCode
                                  select new
                                  {
                                      t1.IdCode,
                                      t1.Value,
                                      t1.Address,
                                      t2.IdSettlement
                                  });
                foreach (var sourceObj in joinResult)
                {
                    Hospital targetObj = new Hospital();

                    targetObj.ID = (int)sourceObj.IdCode;
                    targetObj.HospitalName = sourceObj.Value;
                    targetObj.HospitalAddress = sourceObj.Address;
                    targetObj.SettlementId = (int)sourceObj.IdSettlement;

                    listHospital.Add(targetObj);
                }
                newDb.Hospitals.AddRange(listHospital);
                newDb.SaveChanges();
            }
        }

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多