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

Erx*_*der 5 c# linq vb.net asp.net linq-to-sql

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

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

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


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

cal*_*cat 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)
Run Code Online (Sandbox Code Playgroud)

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

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


Rob*_*ley 0

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

INSERT table (columns...)
OUTPUT inserted.ID
SELECT columns...
Run Code Online (Sandbox Code Playgroud)

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