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数据库中的数据,也不是数据库中的数据.
如果您分解代码并突出显示每个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()是通常发生的最后一件事(在简单查询中).
我敢打赌,没有UserName上Profile.你想要
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)
| 归档时间: |
|
| 查看次数: |
3559 次 |
| 最近记录: |