2012-09-22 58 views
15

使用查找dbSet記錄我有一個用戶表:查找無主鍵

Users: 
+ID 
+Username 
+... 

我想用myDBContext.Users.Find(Username)到鰭用戶。 在我目前的情況下,我不能使用他的ID。

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

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

我也試圖定義的用戶名在我的EDMX一個主鍵,但是,導致以下錯誤:

Properties referred by the Principal Role User must be exactly identical to the key of the EntityType CamelotShiftManagementModel.User referred to by the Principal Role in the relationship constraint for Relationship CamelotShiftManagementModel.AssociationUserFK1. Make sure all the key properties are specified in the Principal Role. C:\Code\CamelotShiftManagement\CamelotShiftManagement\Models\CamelotDB.edmx 278 11 CamelotShiftManagement

回答

35

試用,

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

使用SingleOrDefault insted Single。如果用戶不存在,則Single將引發錯誤。而SingleOrDefault將返回null如果用戶未找到其他User對象將返回。

選擇之SingleOrDefaultFirstOrDefault

您可以通過使用SingleOrDefaultFirstOrDefault但在選擇哪種方法獲取用戶對象使用以下考慮點。

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

FirstOrDefault

  • 通常FirstOrDefault或者當我們需要單個值(第一)從集合或數據庫使用First
  • 在Fist/FirstOrDefault的情況下,從數據庫中只檢索到一行,因此它比單/ SingleOrDefault執行得稍好。這樣的小差異幾乎不可察覺,但是當表格包含大量列和行時,此時性能是顯而易見的。

其他一些言論

  • 如果username是主鍵,那麼我認爲不會有多少/ SingleOrDefaultFirstOrDefault性能作爲主鍵之間沒有差異,指數和指數列搜索將始終比普通列快。
  • SingleSingleOrDefault將生成一個像「SELECT ...」一樣的常規TSQL。
  • FirstFirstOrDefault方法會產生這樣的TSQL statment「SELECT TOP 1 ...」
+0

更好! .. 謝謝。 – Mortalus

+0

改用'FirstOrDefault'會不會更好?我對SingleOrDefault方法的理解是,它將瀏覽* whole *表以確保只有一條記錄與條件匹配。這可能不是OP想要的。 – Crono

+1

@Crono是的,如果我們考慮它與SingleOrDefault相比的性能,那麼你是正確的FirstOrDefault。但在這裏,我認爲取決於預期的結果,我們應該在這兩種方法之間進行選擇。如果你只想要單個結果,並且如果有多個序列相同,那麼你需要一個異常,然後使用SinleOrDefault,否則使用FirstOrDefault。我會用這個上下文更新我的答案。 –

3

我發現它:

User myUser = myDBContext.Users.Single(user => user.Username == i_Username); 
+0

是的,它是好的,但你應該接受它作爲回答,因爲它是你的問題的解決方案。 –

+0

好吧,它告訴我,我只能在兩天內接受它,所以我會等.. tnx – Mortalus

+0

@Mortalus找到我的答案,如果它有助於你的問題。我只是將Single更改爲SingleOrDefault。 –