如何使用LINQ将临时表迁移到SQL



我有两个表:contacts和contact_temps。contact_temps表反映了contacts表。我想做的只是简单地从临时表中提取记录,并将它们插入联系人中。之后,我将从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();

我想知道您的"提交时全部插入"是否会导致实体与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();

您还可以编写一个存储的proc并将其导入数据库上下文中,然后直接调用它。

var result=db。ExecuteCommand("插入联系人中,从contacts_temp中选择*,其中SessionKey={0}",contact.Profile.SessionId);

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

p.S.谷歌"代码优先存储过程",寻找一种使用EF 4.1 调用存储过程的方法

相关内容

  • 没有找到相关文章

最新更新