实体框架- c# MVC 4中的Linq Where子句
本文关键字:中的 Linq Where 子句 MVC 框架 实体 | 更新日期: 2023-09-27 17:52:47
我试图选择一个字段,是从我的UserProfile表,RoleID。传递给Post方法的参数是Username,它是一个正常工作的文本框中的字符串。
[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
s。
where语句中的a
是一个int
值,你现在没有办法找到用户名,这个where语句字面上没有意义。
.Where(a=>Profile.UserName.Contains(UserName))
当你像Grant Winney的答案那样重新排列Lambda表达式时,你可以看到为什么大多数时候Select()
是通常发生的最后一件事(在简单查询中)。
我打赌Profile
上没有UserName
。如果你想
string applyfor = db.Profiles
.Where(p => p.User.Any(u.UserName == UserName))
.Select(p => p.RoleID)
.First();
作为旁注,Microsoft的最佳实践是使用Camel-Case方法参数。所以我建议你的方法如下:
public ActionResult GetRoles(string userName) // or username
{
}
Where语句应该看起来更像这样:
... .Where(a => a.UserName == Profile.UserName).FirstOrDefault();
试试这个:
string applyfor = db.Profiles
.Where(x => x.UserName == UserName)
.Select(x => x.RoleID)
.First();
另外,如果有机会找不到匹配的记录,请使用FirstOrDefault()
而不是.First()
,然后测试null
。