C# 如何在ASP.NET MVC中将域对象列表转换为控制器上的viewmodels

C# 如何在ASP.NET MVC中将域对象列表转换为控制器上的viewmodels,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我想知道将我检索的域对象列表转换为控制器中自定义ViewModels的最佳方法 e、 g IList\u balls=\u ballsService.GetBalls(搜索条件); 进入 IList\u balls=\u ballsService.GetBalls(搜索条件); 它不必完全如我上面所述,也就是说,它不必是IList,如果不直接访问服务,而是通过其他层将对象转换为viewmodels,那么也可以 感谢对于简单的对象,您只需使用Linq即可: IList<BallViewM

我想知道将我检索的域对象列表转换为控制器中自定义ViewModels的最佳方法

e、 g

IList\u balls=\u ballsService.GetBalls(搜索条件);
进入

IList\u balls=\u ballsService.GetBalls(搜索条件);
它不必完全如我上面所述,也就是说,它不必是IList,如果不直接访问服务,而是通过其他层将对象转换为viewmodels,那么也可以


感谢对于简单的对象,您只需使用Linq即可:

IList<BallViewModel> _balls = _ballsService.GetBalls(searchCriteria)
    .Select(b => new BallsViewModel
                 {
                     ID = b.ID,
                     Name = b.Name,
                     // etc
                 })
    .ToList();
IList\u balls=\u ballsService.GetBalls(搜索条件)
.选择(b=>newballsviewmodel
{
ID=b.ID,
Name=b.Name,
//等
})
.ToList();
但是,这可能会变得非常重复,因此您可能希望为BallViewModel类提供一个构造函数,该构造函数接受一个球并为您完成工作


另一种方法是使用类库将属性(甚至是嵌套属性)从域对象复制到视图模型。

可能有点Linq,类似于

var ballQuery = from ball in _ballsService.GetBalls(searchCriteria)
                select new BallViewModels
                {
                    Diameter = ball.Diameter,
                    color = ball.Color,
                    ...
                }
IList<BallViewModels> _balls = ballQuery.ToList();
var ballQuery=来自_ballsService.GetBalls中的ball(搜索条件)
选择新的BallViewModels
{
直径=球体直径,
颜色=球。颜色,
...
}
IList_balls=ballQuery.ToList();
或者这个问题比我想象的要复杂…

我一直都在做这件事。它非常灵活,到目前为止对我来说没有任何问题

首先,在应用程序初始化过程中设置一个地图,如:

Mapper.CreateMapping<Balls, BallViewModel>();
Mapper.CreateMapping();
无论何时需要映射对象,都可以执行以下操作:

Mapper.Map<IList<Balls>, IList<BallViewModel>>(_ballsService.GetBalls());
Mapper.Map(_-ballsService.GetBalls());

正如我所说,它非常灵活,您可以使用fluent API修改每个属性的映射方式。

有很多答案,其他手动方式,创造性地使用反射(我假设AutoMapper就是这么做的)可能是介于两者之间的一些东西,但linq是简单有效的,因此答案很明显。Nice——必须进行调查。
Mapper.CreateMapping<Balls, BallViewModel>();
Mapper.Map<IList<Balls>, IList<BallViewModel>>(_ballsService.GetBalls());