невозможно преобразовать из 'System.Collections.Generic.List - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь удалить пользователя из базы данных при нажатии кнопки на странице, но я получаю эту ошибку, когда создаю свой метод 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");
    }

Моя таблица просмотра имеет цикл ниже, который добавляет кнопку для удаления пользователя.Он отправляет идентификатор пользователя, который я поместил в модель.

            @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; }
}

и, конечно, идентификатор пользователя установлен в моем GET.Со всеми настройками для удаления, как я могу обновить свой метод контекста, чтобы фактически удалить пользователя из базы данных при отправке идентификатора?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

В контексте удаления вы должны получить элемент с текущим идентификатором.Для этого вам следует использовать FirstOrDefault (предложение Where не будет выполнено до тех пор, пока вы не используете FirstOrDefault или ToList).

Попробуйте это:

var delObj = Users.FirstOrDefault(u => u.Id == id);
1 голос
/ 25 апреля 2019

Вы получили эту ошибку, потому что вы смешиваете стили для написания запроса, и потому что ваш запрос не очень корректен

Вы хотите:

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

, и есть гораздо больше методов, которые вы можете использовать, чтобы получить желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...