我在页面上单击按钮时尝试从数据库中删除用户,但是当我在上下文中创建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; }
}
当然UserID在我的GET中设置。有了要删除的所有设置,如何在发送ID时更新我的上下文方法以实际从数据库中删除用户?
在删除上下文中,您必须获取具有当前Id的元素。为了实现它,您应该使用FirstOrDefault(在您使用FirstOrDefault或ToList之前,Where子句未完成)。
试试这个:
var delObj = Users.FirstOrDefault(u => u.Id == id);
您收到此错误是因为您正在混合样式来编写查询,并且因为您的查询不是非常有效
你要:
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);
还有更多的方法可以用来获得你想要的结果。