刚刚想出如何使用Automapper从模型中填充我的ViewModel,我现在正处理下一个挑战 - 从连接表中填充ViewModel属性。
下图描绘了我的简单数据库。
我的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)?
提前致谢!
答案 0 :(得分:4)
如果源类和目标类满足某些要求,AutoMapper可以自动展平对象结构。
Person.PersonInfo
(1:1,但n:1也可以)。 1 PersonViewModel.PersonInfoStatus
,所以AutoMapper会看到源对象中有一个属性PersonInfo
,被引用对象中有一个属性Status
。如果你有这些东西,你可以做到
persons = context.People.Project().To<PersonViewModel>().ToList();
Project().To
语法是一个相对较新的API,可以在IQueryable
上运行。有关详细信息,请参阅Does AutoMapper support Linq?。
您将看到这会向数据库发送JOIN查询。
1 AutoMapper还可以聚合/展平相关的集合,但这是一个不同的章节。