Automapper和Linq连接表,填充ViewModel属性

时间:2013-11-27 21:57:07

标签: linq entity-framework viewmodel automapper

刚刚想出如何使用Automapper从模型中填充我的ViewModel,我现在正处理下一个挑战 - 从连接表中填充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

请注意将PersonInfo加入Person的PersonStatus和PersonPreference的其他字段。 这是我用来实例化映射配置的代码:

        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)?

提前致谢!

1 个答案:

答案 0 :(得分:4)

如果源类和目标类满足某些要求,AutoMapper可以自动展平对象结构。

  • 源类(映射开始的类)应该具有相关类的引用属性。在你的情况下:Person.PersonInfo(1:1,但n:1也可以)。 1
  • 目标类应包含允许AutoMapper解析引用对象的属性路径的属性名称。在你的情况下:PersonViewModel.PersonInfoStatus,所以AutoMapper会看到源对象中有一个属性PersonInfo,被引用对象中有一个属性Status

如果你有这些东西,你可以做到

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

Project().To语法是一个相对较新的API,可以在IQueryable上运行。有关详细信息,请参阅Does AutoMapper support Linq?

您将看到这会向数据库发送JOIN查询。


1 AutoMapper还可以聚合/展平相关的集合,但这是一个不同的章节。