Вывод данных в представление, заменяя ID на значения

Рейтинг: 0Ответов: 1Опубликовано: 28.03.2015

Работаю над созданием небольшего журнала для своих целей. Столкнулся с проблемой вывода нужных данных в представления.

Есть БД, основная таблица works, у нее есть связи по id_po и id_server, таблицы servers и programs должны использоваться как набор справочника.

Проект на MVC 4. Как сделать, чтобы в результате ID_server и ID_PO подменялись названиями и вывести это в представление?

На SQL запрос выглядит примерно так, выдает то, что я бы хотел видеть в asp.net:

SELECT DATE, NAME_PO, NAME_SERVER, VERSION, EXECUTOR, NomIZM, COMMENT, STATYS
FROM servers, PROGRAMS, WORKS
WHERE (PROGRAMS.ID_PO=WORKS.ID_PO) AND (SERVERS.ID_SERVER=WORKS.ID_SERVER)

Ответы

▲ 1
public class Work
{
    public int Id {get;set;}
    public int ServerId {get;set;}
    public int ProgramId {get;set;}

    //Прочие свойства        

    [ForeignKey("ServerId")]
    public virtual Server Server {get;set;}
    [ForeignKey("ProgramId")]
    public virtual Program Program {get;set;}
}

добавляем в модель Навигационные свойства Server и Program

создадим View модель для отображения списка work

public class WorkListView
{
    public int Id {get;set;}
    public string ServerName {get;set;}
    public string ProgramName {get;set;}
}

использовать можно например так:

var works = context.Works
                   .Select(x=> new WorkListView
                   {
                       Id = x.Id,
                       ServerName = x.Server.Name,
                       ProgramName = x.Program.Name
                   })
                   .ToList();

либо можно воспользоваться AutoMapper тогда это можно сделать так:

var works = context.Works.ToList(); // получаем необходимую коллекцию
Mapper.CreateMap<Work, WorkListView>(); // создаем карту
//на выходе будет List<WorkListView>
var model = Mapper.Map<IEnumerable<Work>, IEnumerable<WorkListView>>(works);

что бы использовать automapper минимально необходимо сделать следующее:

  1. Добавить Навигационные поля в исходную модель
  2. Во View модели дать имена следующего вида: ProgramName где Program навигационное свойство, Name необходимое свойство из связанной таблицы.

P.S.: в приведенном мной примере использовался подход CodeFirst но тоже самое можно сделать и при DatabaseFirst