如何使用LINQ to SQL迁移临时表?

时间:2011-05-31 22:54:55

标签: c# linq linq-to-sql

我有两个表:contacts和contact_temps。 contact_temps表镜像联系人表。我想要做的只是从临时表中提取记录并将它们插入到联系人中。之后我将从contact_temps表中删除这些记录。

以下代码仅迁移一条记录,不会从临时表中删除任何内容。我该如何解决我的问题?感谢。

            // migrate temp profile(s)...
            var tempProfilesToMigrate = from ct in db.contact_temps
                                         where ct.SessionKey == contact.Profile.SessionId
                                         select new contact();



            db.contacts.InsertAllOnSubmit(tempProfilesToMigrate);
            db.SubmitChanges();

            //...clear temp table records
            var tempProfilesToDelete = from ct in db.contact_temps
                                        where ct.SessionKey == contact.Profile.SessionId
                                        select ct;

            db.contact_temps.DeleteAllOnSubmit(tempProfilesToDelete);
            db.SubmitChanges();

2 个答案:

答案 0 :(得分:0)

var result = db.ExecuteCommand(“插入联系人select * from contacts_temp,其中SessionKey = {0}”,contact.Profile.SessionId);

当然,这只是我的头脑,但你明白了。更好的方法是将迁移和删除放入存储过程中。您正在使用的方法将所有contact_temp记录往返两次(一次来回插入一次,一次用于删除)。

P.S。 google“代码第一存储过程”,用于使用EF 4.1调用存储过程的方法

答案 1 :(得分:0)

我想知道你的“提交时全部插入”是否导致实体与db.contacts相关联。试试这个。

// migrate temp profile(s)...
var tempProfiles = from ct in db.contact_temps
                             where ct.SessionKey == contact.Profile.SessionId
                             select ct;

foreach (var c in tempProfiles)
{
    Contact newC = new Contact();
    newC.Name = c.Name;
    // copy other values

    db.contacts.InsertOnSubmit(newC);
}

// WAIT! do it at once in a single TX => avoid db.SubmitChanges() here.

 db.contact_temps.DeleteAllOnSubmit(tempProfiles);

 // Both sets of changes in one Tx.
 db.SubmitChanges();

您还可以编写存储过程并将其导入到db上下文中,然后调用它。