Asp.net-Mvc

在沒有主鍵的情況下使用 Find 在 dbSet 中查找記錄

  • September 22, 2012

我有一個使用者表:

Users:
+ID
+Username
+...

我想用myDBContext.Users.Find(Username)find一個使用者。在我目前的情況下,我不能使用他的 ID。

我必須使用完整的 LINQ 查詢嗎?例如

var user = from users in myDBContext.Users.Find(Username) 
          where users.Username == username
          select users

我還嘗試將使用者名定義為我的 edmx 中的主鍵,但這導致了以下錯誤:

主體角色使用者引用的屬性必須與關係 CamelotShiftManagementModel.AssociationUserFK1 的關係約束中主體角色引用的 EntityType CamelotShiftManagementModel.User 的鍵完全相同。確保在 Principal Role 中指定了所有關鍵屬性。C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

嘗試,

User myUser = myDBContext.Users.SingleOrDefault(user => user.Username == username);

使用SingleOrDefaultinsted 的Single。如果使用者不存在,Single則會拋出錯誤。如果未找到使用者,SingleOrDefault則將返回null,否則User將返回對象。

SingleOrDefault在和之間選擇FirstOrDefault

您可以使用SingleOrDefaultand獲取使用者對象,FirstOrDefault但在選擇要使用的方法時請考慮以下幾點。

  • 如果存在,則兩者都只從集合/數據庫返回一個值,否則返回預設值。
  • 但是,如果您有多個同名使用者,並且您希望在執行 LINQ 查詢時遇到異常,那麼請使用SingleOrDefault,因為如果有多個可用元素,它將引發異常。
  • 如果您不想要異常和/或您不想檢查您的集合/數據庫是否有重複數據,只想從集合/數據庫中獲取第一個值,然後使用FirstOrDefault以獲得更好的性能比較SingleOrDefault

FirstOrDefault

  • 通常FirstOrDefaultFirst在我們需要集合或數據庫中的單個值(第一個)時使用。
  • 在 First / FirstOrDefault 的情況下,僅從數據庫中檢索一行,因此它的性能略好於 single / SingleOrDefault。如此小的差異幾乎不會引起注意,但是當表包含大量列和行時,此時性能是顯而易見的。

其他一些備註

  • 如果是主鍵,那麼我認為和性能username之間不會有(顯著)差異,因為主鍵具有索引並且對索引列的搜尋總是比普通列快。SingleOrDefault``FirstOrDefault
  • Single或者SingleOrDefault會生成一個像“SELECT …”這樣的正常 TSQL。
  • Firstor方法將FirstOrDefault生成 TSQL 語句,如“SELECT TOP 1…”

引用自:https://stackoverflow.com/questions/12545565