簡體   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