C# Linq查询未从数据库字段返回值

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

我真的不知道为什么这不是我期望的查询方式,尽管我对编程很陌生,但在我的头脑中这似乎是正确的

我使用this.Context.User.Identity.Name返回登录的用户,但它返回的是电子邮件而不是用户名。下面是它上下文中的脚本

@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。作为程序员,您可以智能地决定查询是否返回单个项。