#c# #asp.net-mvc #linq
#c# #asp.net-mvc #linq
Вопрос:
Мне нужно объединить две таблицы в моем контроллере и передать результат моему представлению. Проблема в том, что, похоже, я не могу получить доступ к значениям столбцов из объединенной таблицы, как только я нахожусь в представлении.
Я пытался выполнить объединение в своем контроллере, но у меня такое чувство, что я иду в неправильном направлении.
Контроллер:
//GET: kurser/stats/5
public ActionResult Stats()
{
var stat = from k in db.kursister
join ku in db.kurser
on k.kursus_id equals ku.kursus_id
select k;
return View(stat);
}
Мое мнение:
@model IEnumerable<Itucation.Models.kursister>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<div>
@{
foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.kursus_navn)<br/>
}
}
</div>
Я ожидаю, что смогу получить значение kursus_navn, которое находится в таблице kursus, которую я пытаюсь объединить с таблицей kursister. Но это не работает.
Комментарии:
1. Похоже, что в вашем запросе linq вы выбираете только
k
объект. В настоящее время вы получите все записи kursister, которые имеют соответствующий kursus_id в kurser, но нет данных из таблицы kurser.2. потому что вы просто выбираете
k
, и вы можете получить доступ только к свойствуkursister
модели, поэтому вы не можете получить доступkurser
, потому что вы не выбрали это свойство
Ответ №1:
Вы выбираете столбцы только db.kursister
после объединения двух таблиц. Чтобы выбрать все столбцы из обоих db.kursus
и db.kursister
, вам нужно изменить свое select
утверждение на это:
var stat = from k in db.kursister
join ku in db.kursus
on k.kursus_id equals ku.kursus_id
select new KursisterusViewModel {k = k, ku = ku};
Затем в поле зрения:
<div>
@{
foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.ku.kursus_navn)<br/>
}
}
</div>
Обновить
Поскольку анонимный тип не поддерживается на странице razor, вам необходимо создать новый класс, подобный KursisterusViewModel
, чтобы перенести в него ваши данные:
public class KursisterusViewModel
{
public kursister k { get; set; }
public kursus ku { get; set; }
}
Затем измените первую строку страницы razor на эту:
@model IEnumerable<Itucation.ViewModels.KursisterusViewModel>
Предполагая, что KursisterusViewModel
класс находится в ViewModels
папке.
Обратите внимание, что Select
инструкция также была обновлена.
Комментарии:
1. большое вам спасибо за ответ. Я отредактировал свой код в соответствии с вашим ответом, но теперь я получаю эту ошибку: ‘kurser’ не содержит определения для ‘ku’, и не удалось найти метод расширения ‘ku’, принимающий первый аргумент типа ‘kurser’ (вам не хватает директивы using или ссылки на сборку?)
2. @Lasserh Причина в том, что анонимные типы не поддерживаются на страницах razor. Я обновил ответ. Дайте мне знать, если у вас все еще есть какие-либо проблемы.
3. Привет @rad, я добиваюсь прогресса благодаря вашей помощи. Тем не менее, я все еще получаю сообщение об ошибке. на этот раз элемент модели, переданный в словарь, имеет тип ‘System. Коллекции. Generic.List
1[<>f__AnonymousType4
3[Обучение. Модели.kursister, обучение. Models.kursus_kursist,Itucation. Models.kurser]]’, но для этого словаря требуется элемент модели типа ‘System. Коллекции. Общий. IEnumerable`1[Обучение. Модели. KursisterusViewModel]’ Я пытался использовать return View (статистика. ToList()); — но, видимо, это не так. У вас есть еще какие-нибудь предложения в рукаве?4. Вы применили все внесенные мной изменения? например, вы изменили
select
инструкцию наselect new KursisterusViewModel {k = k, ku = ku};
?5. Вы правы, конечно. После того, как я правильно прочитал ваш обновленный ответ и соответствующим образом обновил свой код — все работает прекрасно. большое вам спасибо.