单击页面上的按钮时,我试图从数据库中删除用户,但是在上下文中创建Delete方法时,出现此错误。
cannot convert from 'System.Linq.IQueryable<System.Linq.IQueryable<WebApplication4.Models.ApplicationUser>>' to 'WebApplication4.Models.ApplicationUser'
这是我上下文中的代码
public void Delete(string id)
{
var delObj = from user in Users select Users.Where(u => u.Id == id);
Users.Remove(delObj);
SaveChanges();
}
下面是我的控制器
[HttpPost]
public ActionResult DeleteUser(string id)
{
ApplicationDbContext context = new ApplicationDbContext();
context.Delete(id);
return RedirectToAction("Index");
}
我的视图表具有以下循环,该循环添加了一个用于删除用户的按钮。它会发送我放置在模型中的userId。
@foreach (var user in Model)
{
<tr>
<td>@user.Username</td>
<td>@user.Email</td>
<td>@user.Role</td>
<td><a href="@Url.Action("DeleteUser", "UserControl", new { id = user.UserId })">Delete user</a></td>
</tr>
}
型号:
public class UserControlModel
{
public string UserId { get; set; }
public string Username { get; set; }
public string Email { get; set; }
public string Role { get; set; }
}
,当然,用户ID是在我的GET中设置的。删除所有设置后,发送ID时,如何更新上下文方法以实际从数据库中删除用户?
答案 0 :(得分:2)
在删除上下文中,您必须获取具有当前ID的元素。为了实现它,您应该使用FirstOrDefault(在使用FirstOrDefault或ToList之前,Where子句不会完成)。
尝试一下:
var delObj = Users.FirstOrDefault(u => u.Id == id);
答案 1 :(得分:1)
出现此错误是因为您混合使用多种样式编写查询,并且查询不是很有效
您要
ApplicationUser user;
您尝试使用的语法样式通常会返回:
IEnumerable<ApplicationUser> users;
使用您的语法,您终于得到了:
IQueryable<IQueryable<WebApplication4.Models.ApplicationUser>> forEachUserYouGetUser
使用尝试使用的样式来实现您想要的目标:
// not materialized yet
// This is also IQueryable<ApplicationUser> because IQueryable<out T> derives from IEnumerable<out T>
IEnumerable<ApplicationUser> users = from user in Users
where user.Id == id
select user;
var user = users.FirstOrDefault();
if (user!=null)
{
Users.Remove(user);
SaveChanges();
}
更简单的方法是将特定行更改为(在另一个答案中也提到):
var delObj = Users.FirstOrDefault(u => u.Id == id);
或
var delObj = Users.Find(id);
还有很多方法可以用来获取所需的结果。