【发布时间】:2015-11-10 20:30:07
【问题描述】:
在我们的数据库中,我们有一个缺少标识列的表。有一个 Id 列,但是在输入记录时手动填充。 ID 超过 90,000 的任何项目都会被保留,并在全球范围内填充到所有客户数据库中。
我正在构建一个工具来使用 Entity Framework 处理对该表的批量插入。我需要在不遍历每一行的情况下即时找出找到第一个可用 Id 的最有效方法是什么(低于 90,000)。在许多数据库中,很可能有人只是简单地选择了一个没有被采用的随机数并用它来插入行。
我最好的办法是什么?
编辑
在看到列出的一些解决方案后,我尝试在 Linq 中复制 SQL 逻辑。我怀疑它是否完美,但它看起来非常快速和高效。
var availableIds = Enumerable.Range(1, 89999)
.Except(db.Table.Where(n => n.Id <= 89999)
.Select(n => n.TagAssociationTypeID))
.ToList();
【问题讨论】:
-
我不知道如何找到“第一个可用的”,但您可以很容易地找到“最后使用的”
select max(ID) + 1 from YourTable where ID < 90000,确保将所有这些都包含在Serialzeable级别的事务中,所以有些人不使用你下面的 ID。 -
另外“使用实体框架批量插入此表” 实体框架不是为批量插入而设计的,尝试使用它会导致性能非常差。选择另一个 ORM 或使用 EntityFramework.BulkInsert 库来获取批量操作。
-
你可以试试 GUID.GetHasCode,你得想办法阻止它超过 90,000,-stackoverflow.com/questions/2920696/…
-
我建议使用 SQLServer 的 SEQUENCE 功能
-
@ScottChamberlain 我正在使用那个库。所以那里不用担心。而且我不只是想继续其他人停止编号的地方,因为我看到人们使用诸如 89,900 之类的值以及其他同样疯狂的东西。
标签: c# sql-server entity-framework linq entity-framework-6