获取LINQ Select查询的结果并将其分配给字符串
我编写了这个小函数来通过ID获取用户电子邮件:获取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
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是新手,我正在学习它。当做