实体框架- 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的一部分,数据库中也有数据

实体框架- c# MVC 4中的Linq Where子句

如果您分解代码并突出显示每个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