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)
您可以使用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)
该软件包有很多配置选项,因此请查看文档以了解它是否适合您的需求,并确定使用它的最佳方式。
| 归档时间: |
|
| 查看次数: |
6209 次 |
| 最近记录: |