无法从'System.Collections.Generic.List <system.linq.iqueryable <>转换

时间:2019-04-24 20:32:39

标签: c# asp.net-mvc visual-studio-2017

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

2 个答案:

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

还有很多方法可以用来获取所需的结果。