使用Linq to SQL进行MERGE

THX*_*138 8 merge linq-to-sql

SQL Server 2008 Ent ASP.NET MVC 2.0 Linq-to-SQL

我正在建立一个游戏网站,跟踪特定玩家(香椿)何时击落某个怪物(老板).表看起来像:

int ToonId
int BossId
datetime LastKillTime
Run Code Online (Sandbox Code Playgroud)

我使用3d派对服务给我回来最新信息(香椿,老板,时间).
现在我想用这个新信息更新我的数据库.
蛮力方法是逐行upsert.但它看起来很丑(代码方面),也可能很慢.

我认为更好的解决方案是插入新数据(使用临时表?)然后运行MERGE语句.

这是好主意吗?我知道临时表是"更好避免".我应该为此操作创建一个永久的"临时"表吗?
或者我应该只读取整个当前集(最多100行),合并并从应用程序中重新放回?

任何指针/建议总是受到赞赏.

Blo*_*ard 7

如果您正在使用Linq-to-SQL,那么upsert并不是那么难看......

foreach (var line in linesFromService) {
   var kill = db.Kills.FirstOrDefault(t=>t.ToonId==line.ToonId && t.BossId==line.BossId);
   if (kill == null) {
      kill = new Kills() { ToonId = line.ToonId, BossId = line.BossId };
      db.Kills.InsertOnSubmit(kill);
   }
   kill.LastKillTime = line.LastKillTime;
}
db.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

不是艺术品,而是比SQL更好.另外,只有100行,我不会太在意性能.


Pan*_*vos 7

ORM是执行批处理操作的错误工具,Linq-to-SQL也不例外.在这种情况下,我认为您已经选择了正确的解决方案:快速将所有条目存储在临时表中,然后使用合并执行UPSERT.

将数据存储到临时表的最快方法是使用SqlBulkCopy将所有数据存储到您选择的表中.