实体到ViewModel映射真的需要AutoMapper / ValueInjector吗?

时间:2014-05-13 08:31:47

标签: c# linq entity-framework viewmodel automapper

我想知道在将实体框架实体映射到ViewModels时是否真的需要使用一些对象到对象的映射器。周围的样本通常显示1实体映射到1视图模型。但现实生活通常是不同的;因为我们通常需要连接多个表并从每个表中选择一些列。 (我使用POCO实体和ASPNET MVC)以下是我总是用来将我的linq查询结果映射到ViewModels的内容。

public List<MyViewModel> GetSomeDataForView(string filter1)
    {
        using (MyEntities context = GetMyEntites())
        {
            var query = (from t1 in context.Table1
                         join t2 in context.Table2 on t2.Table1Id equals t1.Id
                         join t3 in context.Table3 on t3.Table2Id equals t2.Id
                         where t1.FilterColumn=filter1
                         select new MyViewModel
                         {
                             Property1 = t1.Column1,
                             Property2 = t1.Column2,
                             Property3 = t2.Column1,
                             Property4 = t3.Column1
                         });

            return query.ToList();
        }
    }

2 个答案:

答案 0 :(得分:3)

不,这不是真的需要。无论什么对你有用并满足你的要求就足够了。

Automapper和类似的解决方案允许您将映射逻辑拉出到单独的层并自动化它。有时这是一种好处,有时不是。一切都取决于具体情况。

答案 1 :(得分:1)

不在您展示的示例中,该示例执行自定义投影和加入。通常它在我的项目中看起来像这样:

using (MyEntities context = GetMyEntites())
{
    var query = context.Table1
        .Where(t1 => t1.FilterColumn == filter1)
        Project().To<MyViewModel>();

    return query.ToList();
}

在此处查看更多信息:https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions