使用IEnumerable在域模型和视图模型之间进行映射

时间:2012-08-24 19:49:29

标签: asp.net-mvc-3 linq-to-sql model

所以我的域模型有一个名为Children的属性,它返回所有具有当前对象ID的菜单。我想创建一个视图模型,并在控制器中映射它们之间的值。因此Children属性为IEnumerable<MenuModel>menu.Children属于IEnumerable<MenuCache>类型。最简单的方法是什么?我是否需要旋转所有孩子并将其手动添加到当前模型中,然后重复所有级别?

型号:

public class MenuModel
{
    public int ID { get; set; }

    public string URL { get; set; }

    public int ParentID { get; set; }

    public IEnumerable<MenuModel> Children { get; set; }
}

控制器:

using (var context = ww.WebObjs.WebDataContext.Get())
{
    var menu = context.MenuCaches.Where(x=> x.ID == 0).FirstOrDefault();
    model = new MenuModel()
    {
        ID = menu.ID,
        URL = menu.Text,
        ParentID = menu.ParentID,
        Children = menu.Children // how do I get those children?
   };
}

1 个答案:

答案 0 :(得分:2)

您可以使用LINQ:

using (var context = ww.WebObjs.WebDataContext.Get())
{
    var menu = context.MenuCaches.Where(x => x.ID == 0).FirstOrDefault();
    model = new MenuModel()
    {
        ID = menu.ID,
        URL = menu.Text,
        ParentID = menu.ParentID,
        Children = menu.Children.Select(x => new MenuModel
        {
            Prop1 = x.Prop1,
            Prop2 = x.Prop2,
            // and so on ...
        })
   };
}

AutoMapper我强烈推荐。因此,在定义相应的映射之后,控制器操作变得更具可读性:

using (var context = ww.WebObjs.WebDataContext.Get())
{
    var menu = context.MenuCaches.Where(x => x.ID == 0).FirstOrDefault();
    model = Mapper.Map<MenuCache, MenuModel>(menu);
}