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行),合并并从应用程序中重新放回?
任何指针/建议总是受到赞赏.
如果您正在使用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行,我不会太在意性能.
ORM是执行批处理操作的错误工具,Linq-to-SQL也不例外.在这种情况下,我认为您已经选择了正确的解决方案:快速将所有条目存储在临时表中,然后使用合并执行UPSERT.
将数据存储到临时表的最快方法是使用SqlBulkCopy将所有数据存储到您选择的表中.
| 归档时间: |
|
| 查看次数: |
5643 次 |
| 最近记录: |