C# 实体到视图模型的映射真的需要AutoMapper/ValueInjector吗?

C# 实体到视图模型的映射真的需要AutoMapper/ValueInjector吗?,c#,linq,entity-framework,viewmodel,automapper,C#,Linq,Entity Framework,Viewmodel,Automapper,我想知道在将实体框架实体映射到ViewModels时,是否真的需要使用一些对象到对象映射器。周围的示例通常显示了到1-viewmodel的1-entity映射。但现实生活通常是不同的;因为我们通常需要连接多个表并从每个表中选择一些列。(我使用POCO实体和ASPNET MVC)以下是我经常用来将linq查询结果映射到ViewModels的内容 public List<MyViewModel> GetSomeDataForView(string filter1) {

我想知道在将实体框架实体映射到ViewModels时,是否真的需要使用一些对象到对象映射器。周围的示例通常显示了到1-viewmodel的1-entity映射。但现实生活通常是不同的;因为我们通常需要连接多个表并从每个表中选择一些列。(我使用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();
        }
    }
公共列表GetSomeDataForView(字符串过滤器1)
{
使用(MyEntities context=getmyEntities())
{
var query=(来自context.Table1中的t1
将t2连接到t2.Table1Id等于t1.Id的context.Table2中
将t3连接到t3.Table2Id等于t2.Id的context.Table3中
其中t1.FilterColumn=filter1
选择新的MyViewModel
{
属性1=t1.1列,
属性2=t1.2,
属性3=t2.1列,
房地产4=t3.1列
});
返回query.ToList();
}
}

不,它不是真正需要的。任何适合你并满足你要求的东西都足够好


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

不,实际上并不需要。任何适合你并满足你要求的东西都足够好


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

在您展示的示例中没有,该示例执行自定义投影和连接。在我的项目中通常是这样的:

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

    return query.ToList();
}
使用(MyEntities context=getmyEntities())
{
var query=context.Table1
.其中(t1=>t1.FilterColumn==filter1)
项目()到();
返回query.ToList();
}

请参见此处的更多信息:

不在您显示的示例中,该示例执行自定义投影和连接。在我的项目中通常是这样的:

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

    return query.ToList();
}
使用(MyEntities context=getmyEntities())
{
var query=context.Table1
.其中(t1=>t1.FilterColumn==filter1)
项目()到();
返回query.ToList();
}

请参阅此处的更多信息:

我的观点是,使用POCO实体和嵌套属性通知(在WPF中),您不需要AutoMapper。这些工具主要用于减少繁琐的简单映射任务。在您的示例中,我将使用您所拥有的。我的观点是,使用POCO实体和嵌套属性通知(在WPF中),您不需要AutoMapper。这些工具主要用于减少繁琐的简单映射任务。在您的示例中,我将使用您所拥有的。感谢您提供的有用答案,但在您的示例中,它仍然只是1-table。它是否支持来自多个表的数据,如我的问题所述?如我所说,不是在您展示的示例中。但是,如果您的实体具有适当的导航属性-是的,EF构建的连接将起作用。虽然很少在EF中构建连接而不使用导航属性。感谢您提供的有用答案,但在您的示例中它仍然只是1-table。它是否支持来自多个表的数据,如我的问题所述?如我所说,不是在您展示的示例中。但是,如果您的实体具有适当的导航属性-是的,EF构建的连接将起作用。虽然在EF中构建联接而不使用导航属性是非常罕见的。