Как мне получить доступ к столбцам из объединенных таблиц с помощью Linq, C # в asp.net MVC

#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. Вы правы, конечно. После того, как я правильно прочитал ваш обновленный ответ и соответствующим образом обновил свой код — все работает прекрасно. большое вам спасибо.