繁体   English   中英

C#MVC 4中使用Linq的Where子句

[英]Where clause with Linq in C# MVC 4

我正在尝试从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;

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

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

我在这里做错了什么?

注: RoleID不是的一部分Websecurity ,也有数据库中的数据。

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

string applyfor = db.Profiles
                     ^^^^^^^^

这很可能返回类似DbSet<Profile>

  .Select(s => s.RoleID)
   ^^^^^^

这最有可能返回IQueryable<int> 至此,您已经失去了配置文件的上下文,并且现在只有零个或多个RoleID

所以你a在where语句是一个int值,你也没有办法,现在找一个用户名,这其中的语句字面上是没有意义的。

  .Where(a=>Profile.UserName.Contains(UserName))

当按格兰特·温尼的《答案》所示重新排列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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM