2013-11-27 2 views
2

Как только вы узнали, как заполнить мою ViewModel из модели с помощью Automapper, теперь я перехожу к следующему вызову - заполнению свойств ViewModel из объединенной таблицы.Automapper и Linq с объединенными таблицами, заполняющими свойства ViewModel

Изображение ниже показывает мою простую базу данных.

enter image description here

Мой класс ViewModel определяется как:

public class PersonViewModel 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Nullable<int> Age { get; set; } 
    public Nullable<int> SuffixId { get; set; } 
    public string PersonStatus { get; set; } 
    public string PersonPreference { get; set; } 

    public virtual Suffix Suffix { get; set; } 
} enter code here 

обратите внимание на дополнительные поля PersonStatus и PersonPreference, которые придут от присоединения PersonInfo к человеку. Вот код, я использую для создания экземпляра моей конфигурации отображения:

 Mapper.CreateMap<PersonViewModel, Person>(); 
     Mapper.CreateMap<Person, PersonViewModel>(); 

И теперь код для заполнения ViewModel

 List<PersonViewModel> persons = null; 
     using (var context = new DemoEntities()) 
     { 
      persons = (from p in context.People.AsEnumerable() 
         join i in context.PersonInfoes on p.Id equals i.PersonId 
        select Mapper.Map<PersonViewModel>(p)).ToList(); 
      return persons; 
     } 

Как бы я заполнить два присоединившихся свойства (PersonStatus и PersonPreference) от этого настроить?

Заранее благодарен!

+0

Почему вы присоединяетесь к PersonInfoes? EF будет обрабатывать это для вас автоматически, и automapper будет отображать его. – Scottie

+1

Сначала несколько вопросов: почему 'AsEnumerable()' и как вы получаете один (из многих) 'PersonInfo's? –

+0

Ну, во-первых, это просто простой пример, который я собрал вместе, чтобы задать вопрос. Но Скотти, вы говорите, что AM будет делать это автоматически. Можете ли вы уточнить? Кстати, человек для personinfo фактически от 1 до 1, а не от 1 до многих. Я пытаюсь имитировать бизнес-правило, которое мы имеем в другой системе с этим примером. Gert, я столкнулся с ошибкой без AsEnumerable(), я нашел эту ссылку, которая помогла мне решить ее: http://stackoverflow.com/questions/14770941/linq-and-automapper – xgp

ответ

4

AutoMapper может автоматически сгладить структуру объекта, если исходный и целевой классы соответствуют определенным требованиям.

  • Исходный класс, класс, с которого начинается сопоставление, должен иметь ссылочное свойство связанного класса. В вашем случае: Person.PersonInfo (1: 1, но n: 1 также будет работать).
  • Целевой класс должен содержать имена свойств, которые позволяют AutoMapper разрешать путь свойства к указанному объекту. в вашем случае: PersonViewModel.PersonInfoStatus, поэтому AutoMapper увидит, что в исходном объекте есть свойство PersonInfo и свойство Status в ссылочном объекте.

Если у вас есть эти вещи на месте, вы можете сделать

persons = context.People.Project().To<PersonViewModel>().ToList(); 

Синтаксис Project().To является относительно новым API, что позволяет работать на IQueryable с. Для получения дополнительной информации см. Does AutoMapper support Linq?.

Вы увидите, что это отправляет запрос JOIN в базу данных.


AutoMapper может также агрегатный/расплющить связанные коллекции, но это другая глава.

Смежные вопросы