【发布时间】:2013-10-24 20:02:40
【问题描述】:
我想更新可能有一百万条记录。我喜欢 Linq,我在下面写了这个来尝试完成这个。我真的希望我写这个可怕的错误。跑了好几个小时。我用 T-sql 编写它,它在几分钟内运行。有没有更好的方法可以用 linq 做到这一点?
private static void UpdateZipCodes()
{
Console.WriteLine("Update Zip Codes Started");
DataDataContext _db = new DataDataContext();
var newBadZips = (from n in _db.NewCars
where n.loczip == null || n.loczip == ""
select n).ToList();
foreach (var bad in newBadZips)
{
string lZip = _db.Dealers.Where(x => x.DealerID == bad.DealerID).Select(x => x.Zipcode).SingleOrDefault();
bad.loczip = lZip;
_db.SubmitChanges();
}
Console.WriteLine("Update Zip Codes Finshed");
}
T-Sql 版本
UPDATE n
SET n.loczip = d.Zipcode
FROM NewCars AS n INNER JOIN
Dealers AS d ON n.DealerID = d.DealerID
where n.loczip is null or n.loczip = ''
我明白 linq 的明显作用是做得更多。我想知道如何改进我的 linq 查询?
我并不想比较它们,因为我知道 T-sql 是实现这一目标的正确方法。这主要是为了让我更擅长使用 linq。我确信我会想在某一时刻以较小的规模做这样的事情,并希望在 linq 中正确地做到这一点。
【问题讨论】:
-
“使用删除”是什么意思?
-
我可能是错的,但可能是因为您在代码中与 T-SQL 版本相比执行了 3 种不同的操作。您正在查询数据库并保存一个列表,然后您正在遍历该列表,然后您正在从该列表更新数据库。拥有数百万条记录,这将需要相当长的时间。
-
嗯,ef 不适合批量更新、插入、删除,无论你想要什么。对于批处理操作,请使用原始 sql、批量复制,而不是 EF 和 linq。
-
在查询本身中进行连接,在迭代时更新记录,提交更改一次。
-
@Servy 你说得对,我错过了涉及尺寸的部分。新计划 - 提交更改的频率远低于每条记录。