无法从'System.Collections.Generic.List转换

问题描述 投票:0回答:2

我在页面上单击按钮时尝试从数据库中删除用户,但是当我在上下文中创建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时更新我的​​上下文方法以实际从数据库中删除用户?

c# asp.net-mvc visual-studio-2017
2个回答
2
投票

在删除上下文中,您必须获取具有当前Id的元素。为了实现它,您应该使用FirstOrDefault(在您使用FirstOrDefault或ToList之前,Where子句未完成)。

试试这个:

var delObj = Users.FirstOrDefault(u => u.Id == id);

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);

还有更多的方法可以用来获得你想要的结果。

© www.soinside.com 2019 - 2024. All rights reserved.