在C#MVC 4中使用Linq的where子句

101*_*110 1 c# lambda entity-framework

我正在尝试从我的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;
Run Code Online (Sandbox Code Playgroud)

但是这给了我Sequence不包含任何元素.

我尝试了其他几种方法,比如.Equals().我很确定这是我的where子句.

我在这做错了什么?

注意:RoleID不是Websecurity数据库中的数据,也不是数据库中的数据.

Eri*_*ips 5

如果您分解代码并突出显示每个Lambda语句返回的内容,您将看到问题:

string applyfor = db.Profiles
                     ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

这最有可能返回类似的东西DbSet<Profile>.

  .Select(s => s.RoleID)
   ^^^^^^
Run Code Online (Sandbox Code Playgroud)

这很有可能回归IQueryable<int>.此时您已经丢失了配置文件的上下文,现在只有零个或多个RoleIDs.

所以你a在where语句中是一个intValue,你现在无法找到一个用户名,而这个where语句根本没有意义.

  .Where(a=>Profile.UserName.Contains(UserName))
Run Code Online (Sandbox Code Playgroud)

当您重新安排Lambda表达式时,Grant Winney的答案显示您可以看到为什么大多数时候a Select()是通常发生的最后一件事(在简单查询中).

我敢打赌,没有UserNameProfile.你想要

string applyfor = db.Profiles
                    .Where(p => p.User.Any(u.UserName == UserName))
                    .Select(p => p.RoleID)
                    .First();
Run Code Online (Sandbox Code Playgroud)

作为旁注,Microsoft Best的做法是Camel-Case方法参数.所以我建议您的方法如下:

public ActionResult GetRoles(string userName) // or username
{
}
Run Code Online (Sandbox Code Playgroud)