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

时间:2010-01-18 03:32:54

标签: c# asp.net vb.net linq linq-to-sql

如果没有在LINQ To SQL中第二次访问数据库,我如何从Table 获取主键ID号?

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

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


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

5 个答案:

答案 0 :(得分:12)

如果您有对该对象的引用,则可以在调用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(或等效的主键)并在其他地方使用它。

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:2)

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。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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