C# Linq查询未从数据库字段返回值
我真的不知道为什么这不是我期望的查询方式,尽管我对编程很陌生,但在我的头脑中这似乎是正确的 我使用this.Context.User.Identity.Name返回登录的用户,但它返回的是电子邮件而不是用户名。下面是它上下文中的脚本C# Linq查询未从数据库字段返回值,c#,linq,C#,Linq,我真的不知道为什么这不是我期望的查询方式,尽管我对编程很陌生,但在我的头脑中这似乎是正确的 我使用this.Context.User.Identity.Name返回登录的用户,但它返回的是电子邮件而不是用户名。下面是它上下文中的脚本 @Html.ActionLink("My Account", "Users", new { id = this.Context.User.Identity.Name }, false) @: | @Html.ActionLink("Logout", "Lo
@Html.ActionLink("My Account", "Users", new { id = this.Context.User.Identity.Name }, false) @: | @Html.ActionLink("Logout", "Logout", "Users")
因此,我希望url看起来像网站/Users/Username,因此希望获得用户名而不是电子邮件
查询:
Project1.Models.DBContext db = new Project1.Models.DBContext();
//save u.Username in var user where u.Email == user_logged_in_email
var user = from u in db.Users
where u.Email == this.Context.User.Identity.Name
select u.Username;
我希望linq查询能够找到包含电子邮件地址的行,然后取出用户名并将其存储在var user中。它实际上等于System.Data.Entity.Infrastructure.DbQuery您需要枚举该查询以获得用户:
var user = (from u in db.Users
where u.Email == this.Context.User.Identity.Name
select u.Username).SingleOrDefault();
//SingleOrDefault will return null if no user is found, so you need to check for that before operating upon the user object.
这很好用。我从没想过要这么做。枚举背后的原因是什么?它做什么以及为什么需要它?linq无法知道您的
where
子句是否将返回单个结果,因此从where select always
返回一个集合(实际上,它返回一个可返回集合的查询表)SingleOrDefault()
将返回该集合的唯一元素,如果有多个元素,则抛出错误FirstOrDefault
做了类似的事情,但没有例外。具体来说,LINQ无法知道您不只是想创建一个查询,所以它为您构建了一个查询。可以通过枚举(执行)该查询来提取该查询的结果。直到您对查询调用ToList、Single()、SingleOrDefault()等方法,查询才会运行。啊,我没有意识到linq创建了一个列表,尽管我试图以单个为目标。我想这是经验使然。谢谢你。where子句将根据查询返回IEnumerable。作为程序员,您可以智能地决定查询是否返回单个项。