[英]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.