将对象转换为另一个对象的最有效方法(模型到视图模型)

Rob*_*eia 0 c# model-view-controller asp.net-mvc asp.net-core

假设我有一个包含 20 个字段的模型,并且在我的索引页中,我想列出存储在我的数据库中的所有模型。在索引页面,我没有列出模型的所有字段,我只列出了 3 个字段。

所以,我做了两个类:

class CompleteModel {
    public int Id { get; set; }
    public string Field01 { get; set; }
    public string Field02 { get; set; }
    public string Field03 { get; set; }
    public string Field04 { get; set; }
    public string Field05 { get; set; }
    ...
    public string Field20 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的控制器中,我可以使用:

await _context.CompleteModel.ToListAsync();
Run Code Online (Sandbox Code Playgroud)

但我觉得这似乎不是正确的方法,因为我获取了所有字段并且只使用了 3 个字段。

所以,我做了这个代码:

class ViewModel {
    public string Field02 { get; set; }
    public string Field04 { get; set; }
    public string Field08 { get; set; }
}

var result = _context.CompleteModel.Select(
    x => new {
        x.Field02,
        x.Field04,
        x.Field08
    }).ToListAsync();

var listResults = new List<IndexViewModel>();
if (result != null)
{
    listResults.AddRange(results.Select(x => new IndexViewModel
    {
        Field02 = x.Field02,
        Field04 = x.Field04,
        Field08 = x.Field08
    }));
}
Run Code Online (Sandbox Code Playgroud)

我认为这是很多代码来做到这一点。首先,我选择了我想要的所有字段,然后将所有内容复制到另一个对象。

有一种“更直接”的方式来做同样的事情?

喜欢:

_context.CompleteModel.Select(x => new IndexViewModel { Field02, Field04, Field08 });
Run Code Online (Sandbox Code Playgroud)

Nei*_*ord 6

您可以使用AutoMapper来减少样板,这样您就不会手动复制字段值。

如果你包含 AutoMapper NuGet 包,那么你需要在你的启动中包含以下内容来为你的类配置它:

Mapper.Initialize(cfg => cfg.CreateMap<CompleteModel, ViewModel>());
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

var results = await _context.CompleteModel.ToListAsync();
var viewModelResults = results.Select(Mapper.Map<ViewModel>).ToList();
Run Code Online (Sandbox Code Playgroud)

该软件包有很多配置选项,因此请查看文档以了解它是否适​​合您的需求,并确定使用它的最佳方式。