如果没有在LINQ To SQL中第二次访问数据库,我如何从Table 获取主键ID号?
现在,我将数据提交到一个表中,然后再行一次以确定为新字段分配的id(在自动增量id字段中)。我想在LINQ To SQL中而不是在Raw SQL中执行此操作(我不再使用Raw SQL)。
此外,我的问题的第二部分是:我总是小心地知道在线用户的ID,因为我宁愿使用他们的ID在各种表中调用他们的信息,而不是使用GUID或用户名,都是长串的。我之所以这样做是因为我认为进行数字比较的SQL Server比使用用户名(字符串)甚至是guid(非常长的字符串)比较更有效(?)。我的问题是,我是否比我应该更关心?差异值是否总是将userid(int32)保持在会话状态?
@RedFilter为第一个问题提供了一些有趣/有希望的线索,因为我在这个阶段无法尝试,如果有人知道或可以确认他在答案的评论部分推荐的这些变化?
答案 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作为输出参数可能是最简单的方法。