Linq to sql 使用Linq到SQL进行合并
SQLServer2008ENT ASP.NET MVC 2.0 Linq到SQL 我正在建立一个游戏网站,跟踪特定玩家(卡通)击倒特定怪物(老板)的时间。表看起来像:Linq to sql 使用Linq到SQL进行合并,linq-to-sql,merge,Linq To Sql,Merge,SQLServer2008ENT ASP.NET MVC 2.0 Linq到SQL 我正在建立一个游戏网站,跟踪特定玩家(卡通)击倒特定怪物(老板)的时间。表看起来像: int ToonId int BossId datetime LastKillTime 我使用一个3d派对服务,它可以为我提供最新信息(卡通、老板、时间)。 现在我想用这些新信息更新我的数据库。 蛮力方法是逐行插入。但它看起来很难看(代码方面),而且可能也很慢 我认为更好的解决方案是插入新数据(使用临时表?),然后运行MERG
int ToonId
int BossId
datetime LastKillTime
我使用一个3d派对服务,它可以为我提供最新信息(卡通、老板、时间)。现在我想用这些新信息更新我的数据库。
蛮力方法是逐行插入。但它看起来很难看(代码方面),而且可能也很慢 我认为更好的解决方案是插入新数据(使用临时表?),然后运行MERGE语句 这是个好主意吗?我知道临时表是“最好避免的”。我是否应该仅为此操作创建一个永久“临时”表?
或者我应该读取整个当前集合(最多100行),合并并从应用程序中放回它吗
任何提示/建议都会受到欢迎。看起来像是直接插入
private ToonModel _db = new ToonModel();
Toon t = new Toon();
t.ToonId = 1;
t.BossId = 2;
t.LastKillTime = DateTime.Now();
_db.Toons.InsertOnSubmit(t);
_db.SubmitChanges();
如果您使用的是LINQtoSQL,那么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();
这不是一件艺术品,但比SQL更好。而且,只有100行,我不会太担心性能。ORM是执行批处理操作的错误工具,Linq to SQL也不例外。在这种情况下,我认为您选择了正确的解决方案:快速将所有条目存储在临时表中,然后使用merge执行UPSERT
将数据存储到临时表的最快方法是使用将所有数据存储到您选择的表中。要更新而不首先查询记录,可以执行以下操作。它仍然会点击数据库一次,以检查记录是否存在,但不会拉取记录:
var blob = new Blob { Id = "some id", Value = "some value" }; // Id is primary key (PK)
if (dbContext.Blobs.Contains(blob)) // if blob exists by PK then update
{
// This will update all columns that are not set in 'original' object. For
// this to work, Blob has to have UpdateCheck=Never for all properties except
// for primary keys. This will update the record without querying it first.
dbContext.Blobs.Attach(blob, original: new Blob { Id = blob.Id });
}
else // insert
{
dbContext.Blobs.InsertOnSubmit(blob);
}
dbContext.Blobs.SubmitChanges();
有关此扩展方法,请参阅。如果我已经有id=1的Toon,它不会给我“重复id”吗?我同意,性能不是一个问题,因此使用LINQ方法而不是丑陋的SQL