2013-08-30 25 views
0

我寫了這個小功能,通過ID來獲取用戶的電子郵件地址:獲得一個LINQ選擇查詢的結果,並將其分配給一個字符串

public string GetUserEmailByID(int UserID) 
    { 
     string email = ""; 
     var query = (
       from c in dbContext.Users 
       where (c.ID == UserID) 
       select new 
       { 
        email = c.Email, 
       } 
      ); 
     return email; 
     // return query.ToString(); 
    } 

然後我寫了這個測試吧:

[Test] 
    public void ShouldGetUserEmailByUserIDVerifyItIsCorrect() 
    { 
     Assert.AreEqual("[email protected]", userRepository.GetUserEmailByID(4)); 
    } 

測試失敗,因爲它期待「[email protected]」,但是string.empty。

我在做什麼錯?

回答

0
var query = (
     from c in dbContext.Users 
     where (c.ID == UserID) 
     select new 
     { 
      email = c.Email, 
     } 
    ); 

這只是一個查詢聲明,對於返回匿名類型的對象只有一個屬性叫email列表的查詢。 它與你的局部變量email無關。

甚至更​​重要的是,您只是聲明瞭查詢定義,但根本不執行它!

試試這個:

public string GetUserEmailByID(int UserID) 
{ 
    return (from c in dbContext.Users 
      where (c.ID == UserID) 
       select c.Email).FirstOrDefault(); 
} 
+0

謝謝您解決了此問題。我實際上是Linq的新手,我正在學習它。問候。 –

0

您要返回的電子郵件變量是空字符串,而不是您想要查詢的IEnumerable<T>查詢中的某個對象的屬性。 你可以改變你的代碼:

public string GetUserEmailByID(int UserID) 
{ 
    var query = (
      from c in dbContext.Users 
      where (c.ID == UserID) 
      select c.Email 
     ); 
    return query.FirstOrDefault(); 
} 

這樣的查詢將是一個IEnumerable<string>,所以你只需要採取的第一個元素,或默認的一個這兒有沒有。

+0

謝謝,測試失敗,這是因爲它期待[email protected]但「{=電子郵件} [email protected]」 顯然,表頭正在繪製與查詢結果,如何確保只有'表格單元格'正在獲取? –

+0

可以縮短事件時間:return dbContext.Users.Single(u => t.Id == UserId).Email – Nikolay

+0

@Nikolay我想問題的關鍵是編寫易於閱讀和理解(和明顯工作)的代碼,而不是最短的代碼可能的一個:) – Save

相關問題