【问题标题】:Using Linq to populate ViewModel from Model使用 Linq 从 Model 填充 ViewModel
【发布时间】:2013-11-26 01:01:28
【问题描述】:

我正在从 linq 查询中填充我的视图模型。我有一种方法可以检索看起来像这样的计划列表

        public static IEnumerable<PlanViewModel> GetPlans()
        {
        using (var context = new RepEntities())
        {

            var query = (from p in context.Plans.Include("StatusCommon")
                         join r in context.RealEstateDetails on p.ReId equals r.ReId
                         select new PlanViewModel
                         {
                             PlanName = p.PlanName,
                             ...
                             LastUpdated = p.LastUpdated,
                         });

            return query.ToList();
        }
    }

您看到省略号的地方是大约 30 个其他属性。现在我想构建一个返回单个计划的方法。该方法实际上是相同的,只是它将包含一个 where 子句来指定一个计划 ID。我想重构这段代码,这样我就不会复制模型到 ViewModel 的映射。但是,我没有找到允许我这样做的方法。任何人都可以就如何正确编码提供任何建议,以免这里有太多重复?

提前致谢!

【问题讨论】:

  • 尝试创建存储库添加当前正在执行的 GetAll 方法,添加您想要实现的 GetById 方法..

标签: c# asp.net-mvc linq mapping viewmodel


【解决方案1】:

要么使用反射来填充字段,要么使用像AutoMapper 这样的库。不过我肯定会推荐使用 AutoMapper,它会让你的代码更干净。

另一种可能性是使用implicitexplicit 转换器。

这在很大程度上取决于您想要在哪里获得代码:

  • 实用程序类(反射)
  • 模型/视图模型(隐式或显式)
  • Anywere (AutoMapper)

【讨论】:

  • Jeroen,Automapper 看起来像是解决方案。你碰巧知道它是如何处理导航属性的吗?假设一个计划有一个或多个建筑物。因此,源将是 Plan.Buildings,其中 Buildings 是 List。然后我的目的地 (ViewModel) 将是 PlanViewModel.Buildings,而 Buildings 是 List。 Automapper 可以处理这种嵌套投影吗?
  • 是的,这绝对是可能的。你可以在他们的 wiki 中找到很多信息;相关页面是这样的:github.com/AutoMapper/AutoMapper/wiki/Nested-mappings
猜你喜欢
  • 2012-05-20
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多