获取LINQ Select查询的结果并将其分配给字符串

获取LINQ Select查询的结果并将其分配给字符串,linq,Linq,我编写了这个小函数来通过ID获取用户电子邮件: public string GetUserEmailByID(int UserID) { string email = ""; var query = ( from c in dbContext.Users where (c.ID == UserID) select new

我编写了这个小函数来通过ID获取用户电子邮件:

    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("useremail@test.com", userRepository.GetUserEmailByID(4));
    }
测试失败,因为它预期“useremail@test.com“但是字符串是空的


我做错了什么?

返回的电子邮件变量是空字符串,而您希望在
IEnumerable
查询中包含一个对象的属性。 您可以使用以下命令更改代码:

public string GetUserEmailByID(int UserID)
{
    var query = (
             from c in dbContext.Users
             where (c.ID == UserID)
             select c.Email
         );
    return query.FirstOrDefault();
}
这样的查询将是一个
IEnumerable
,因此您只需要获取第一个元素,或者默认的元素,而没有

var query = (
         from c in dbContext.Users
         where (c.ID == UserID)
         select new
         {
           email = c.Email,
         }
     );
这只是一个查询声明,用于返回匿名类型对象列表的查询,其中只有一个名为
email
的属性它与您的
电子邮件
局部变量无关。

更重要的是,您只是声明了查询定义,但根本不执行它

请尝试以下方法:

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

谢谢,测试失败了,因为这是预期的useremail@test.com但是{Email=useremail@test.com}“显然,正在使用查询结果绘制表头,如何确保只获取‘表单元格’?事件可以更短:return dbContext.Users.Single(u=>t.Id==UserId).Email@Nikolay我想关键是要编写易于阅读和理解(显然是有效的)代码,而不是最短的:)@Nikolay此外,如果没有Id等于userId的用户,该代码可能会返回一个异常谢谢这解决了问题。事实上,我对Linq是新手,我正在学习它。当做