Member 13140365 Ответов: 2

Я получаю сообщение об ошибке в запросе LINQ


У меня есть метод действия в приложении MVC, который извлекает список студентов из таблицы базы данных StudentsInfo с помощью запроса LINQ. Когда я извлекаю все столбцы из таблицы, то запрос работает, но когда я пытаюсь извлечь некоторые конкретные столбцы из таблицы, то я получаю следующее сообщение об ошибке:

Цитата:
Элемент модели, передаваемый в словарь, имеет тип 'System.Коллекции.Generic.List`1[<>f__AnonymousType6`1[System.String]]', но для этого словаря требуется элемент модели типа 'System.Коллекции.Общий.IEnumerable`1[MVCApplication.StudentsInfo]'.


Что я уже пробовал:

Ниже приведен метод действия

public ActionResult GetAllStudents()
        {
            //Retrieve data from StudentsInfo table
           var result = from d in db.StudentsInfo
                        select new
                        {
                            d.StdRegNumber,
                           d.StdName,
                           d.StdDoBirth
                        };

           
            return View(result.ToList());
        }

2 Ответов

Рейтинг:
20

F-ES Sitecore

Когда вы используете "new { ... }" синтаксис вы создаете то, что известно как анонимный тип, смотрите на него как на временный тип или тип, созданный на лету. Анонимные типы могут использоваться только внутри функции, в которой они созданы, поэтому вы не можете передать этот результат в представление.

Если вы хотите уменьшить количество столбцов, то создайте новый конкретный класс с именем что-то вроде StudentViewModel, который имеет три поля, которые вы хотите, а затем измените код на что-то вроде

select new StudentViewModel
{
    StdRegNumber = d.StdRegNumber,
    StdName = d.StdName,
    StdDoBirth = d.StdDoBirth
};


Вам также нужно будет изменить представление, чтобы использовать модель IEnumerable<<StudentViewModel>

Или вы можете просто передать исходный список studentsinfo в представление и просто игнорировать поля, которые вас не интересуют.


Vincent Maverick Durano

5ed

Рейтинг:
1

Vincent Maverick Durano

Как заявил Ф-Х системах , при использовании new ключевое слово, ваш тип возврата будет преобразован в anonymous type Вы получаете ошибку, потому что ваш View ожидает а strongly-type модель IEnumerable<StudentsInfo> но вы возвращали анонимного типа.

Чтобы исправить это, вы можете вернуть динамический тип или ExpandoObject как показано в этой статье: Привязка представлений с анонимной коллекцией типов в ASP.NET MVC - DotNetFunda.com[^]

Имейте в виду, что, отправляясь в anonymous или dynamic тип, вы потеряете все хорошие вещи, которые есть у сильного типа. (например, проверка времени компиляции и intellisense для вашего ViewТак что подумайте об этом. То Controller может закончиться тем, что вы передадите любой тип в View пока во время выполнения. Мы даже не можем проанализировать код и угадать, потому что фильтры действий могут изменить object перешли к виду, насколько нам известно.

Моя рекомендация-использовать строго типизированный текст View и верните конкретную модель, в которой находятся только те поля, которые вы хотите в View точно так же, как то, что уже предложено F-ES Sitecore.