我正在尝试从我的 UserProfile 表 RoleID 中选择一个字段。传递给此 Post 方法的参数是用户名,它是一个来自文本框的字符串,可以正常工作。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult GetRoles(string UserName)
{
if (!string.IsNullOrWhiteSpace(UserName))
{
string applyfor = db.Profiles
.Select(s => s.RoleID)
.Where(a=>Profile.UserName.Contains(UserName))
.First();
ViewBag.ApplyingFor = applyfor;
但是这给了我序列不包含任何元素。
我已经尝试了其他几种方法,例如 .Equals()
。我很确定这是我的 where 子句。
我在这里做错了什么?
注意:RoleID
不是Websecurity
的一部分,数据库中也有数据。
最佳答案
如果您分解代码并突出显示每个 Lambda 语句返回的内容,您就会看到问题:
string applyfor = db.Profiles
^^^^^^^^
这很可能返回类似于 DbSet<Profile>
的内容.
.Select(s => s.RoleID)
^^^^^^
这很可能返回 IQueryable<int>
.此时您已经丢失了配置文件的上下文,现在只有零个或多个 RoleID
所以你的 a
在 where 语句中是一个 int
值,你现在没有办法找到用户名,这个 where 语句从字面上看毫无意义。
.Where(a=>Profile.UserName.Contains(UserName))
当您将 Lambda 表达式重新排列为 Grant Winney's Answer shows 时你可以看到为什么大部分时间都是 Select()
是通常发生的最后一件事(在简单查询中)。
我敢打赌没有 UserName
在 Profile
.你想要
string applyfor = db.Profiles
.Where(p => p.User.Any(u.UserName == UserName))
.Select(p => p.RoleID)
.First();
附带说明一下,Microsoft 最佳实践是 Camel-Case method parameters .所以我推荐你的方法如下:
public ActionResult GetRoles(string userName) // or username
{
}
关于c# - C# MVC 4 中带有 Linq 的 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624864/