2012-07-26 72 views
0

我正在尋找最有效的方法來使用Entityframework和linq從SQL Server數據庫中調用第一個並且只有第一個項目。只請求第一項實體框架

我目前使用

public static UserProfile GetUserProfile(Guid userID) 
    { 
     UserProfile oProfile = null; 

     using (var context = new MyEntities()) 
     { 
      var profiles = from c in context.UserProfiles where c.UserID == userID select c; 

      if(profiles.Any()) 
      { 
       oProfile = profiles.First(); 
      } 
     } 

     return oProfile; 
    } 

然而,這從我可以告訴需要兩個DB操作來完成,一個以檢查記錄存在和第二歸還。我確信必須有更好的模式/方法,我只是沒有看到它。

+0

var profile =(from c in context.UserProfiles where c.UserID == userID select c).First(); – 2012-07-26 14:29:43

+0

使用'FirstOrDefault'它將轉化爲'SELECT TOP 1',如果沒有找到它,結果爲'NULL',所以你可以通過Martins的(FirstOrDefault)回答失去任何延伸的'Any'擴展 – Silvermind 2012-07-26 14:30:28

回答

4

這很簡單:使用FirstOrDefault()。 當沒有條目時它會返回null(就像你已經),否則它會返回第一個條目。如果你不希望你的變量採用空值,則使用兩者之間的替代值。

編輯: 您的代碼可以同樣用下面的代碼替換,只是這個代碼只會針對數據庫查詢一次。

public static UserProfile GetUserProfile(Guid userID) 
{ 
    UserProfile oProfile = null; 

    using (var context = new MyEntities()) 
    { 
     oProfile = (from c in context.UserProfiles where c.UserID == userID select c).FirstOrDefault(); 
    } 

    return oProfile; 
} 
0

您需要使用First()FirstOrDefault(),而無需調用.Any()

var profile = (from c in context.UserProfiles where c.UserID == userID select c).First(); 

First()拋出一個異常,如果沒有記錄返回,但在這種情況下

FirstOrDefault()返回空雙方將生成的SQL是這樣的:

SELECT TOP (1) ... 
FROM ... 
1

如果只有一個項目應該存在(因爲它看起來在這種情況下),那麼你應該考慮使用Single()。 Single會返回第一個項目,但如果存在多個項目則會拋出異常 - 如果只有一個項目存在,這可以幫助保持數據質量。

如果只有一個項目應該存在,但是它是可選的,那麼使用SingleOrDefault,它將作爲Single,但如果不存在項目,則返回null。