繁体   English   中英

如何从表中获取主键而不进行第二次旅行?

[英]How to get the primary key from a table without making a second trip?

如何在进行LINQ To SQL数据库的第二次访问的情况下从表中获取主键ID号?

现在,我将数据提交到一个表中,并再次进行一次旅行,以确定为新字段分配的id(在自动增量id字段中)。 我想在LINQ To SQL中执行此操作,而不是在Raw SQL中执行此操作(我不再使用Raw SQL)。

此外,我的问题的第二部分是:我总是小心地知道在线用户的ID,因为我宁愿使用他们的ID在各种表中调用他们的信息,而不是使用GUID或用户名,这些都是长的字符串。 我之所以这样做是因为我认为进行数字比较的SQL Server比使用用户名(字符串)甚至是guid(非常长的字符串)比较更有效(?)。 我的问题是,我是否比我应该更关心? 差异值是否总是将userid(int32)保持在会话状态?


@RedFilter为第一个问题提供了一些有趣/有希望的线索,因为我在这个阶段无法尝试它们,如果有人知道或可以确认他在答案的评论部分建议的这些变化?

如果您有对该对象的引用,则可以在调用db.SubmitChanges()之后使用该引用并调用主键。 LINQ对象将自动更新其(标识符)主键字段,以反映通过SQL Server分配给它的新主键字段。

示例(vb.net):

  Dim db As New NorthwindDataContext
  Dim prod As New Product
  prod.ProductName = "cheese!"
  db.Products.InsertOnSubmit(prod)
  db.SubmitChanges()
  MessageBox.Show(prod.ProductID)

您可以在函数中包含上面的代码并返回ProductID(或等效的主键)并在其他地方使用它。

编辑:如果您没有进行原子更新,您可以将每个新产品添加到单独的集合中,并在调用SubmitChanges后迭代它。 我希望LINQ像数据集一样提供“数据库偷看”。

除非您正在做一些与众不同的事情,否则您不需要做任何额外的事情来检索生成的主键。

在Linq-to-SQL datacontext上调用SubmitChanges时,它会自动更新对象的主键值。

关于你的第二个问题 - 通过对数字字段进行扫描而不是像varchar()那样,可能会有很小的性能提升,但是通过确保数据库中的正确列被索引,您将看到更好的性能。 并且,对于SQL Server,如果使用标识列创建主键,则默认情况下它将具有聚簇索引。

Linq to SQL使用插入新记录时生成的ID自动设置类的标识值。 只需进入酒店。 我不知道它是否使用了单独的查询,从未使用它,但ORM需要另一个查询来取回最后插入的ID并不罕见。

有两种方法可以独立于Linq To SQL(可以使用它):

1)如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句:

返回受INSERT,UPDATE或DELETE语句影响的每一行的信息或基于表达式的表达式。 这些结果可以返回到处理应用程序,以用于确认消息,存档和其他此类应用程序要求。 或者,可以将结果插入表或表变量中。

2)或者,您可以构造一个这样的批处理INSERT语句:

insert into MyTable
(field1)
values
('xxx');
select scope_identity();

它至少可以用于SQL Server 2000。

在T-SQL中,您可以使用OUTPUT子句,说:

INSERT table (columns...)
OUTPUT inserted.ID
SELECT columns...

因此,如果您可以将LINQ配置为使用该构造进行插入,那么您可以轻松地将其恢复。 但是,LINQ是否可以从插入中获取值,我会让其他人回答这个问题。

从LINQ调用存储过程返回ID作为输出参数可能是最简单的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM