【发布时间】:2016-10-17 19:58:22
【问题描述】:
假设我有一个包含 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; }
}
现在,在我的控制器中,我可以使用:
await _context.CompleteModel.ToListAsync();
但我觉得这似乎不是正确的做法,因为我得到了所有字段并且只使用了 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
}));
}
我认为这样做需要很多代码。 首先,我选择了我想要的所有字段,然后将所有内容复制到另一个对象。
有一种“更直接”的方式来做同样的事情吗?
喜欢:
_context.CompleteModel.Select(x => new IndexViewModel { Field02, Field04, Field08 });
【问题讨论】:
-
您是否获取所有 20fields 值?还是只选择了 2,4 和 8?
-
efficient?代码、性能(计算与传输)、内存? -
可以跳过中间的
.Select(),使用List<IndexViewModel> model = _context.CompleteModel.Select(x => new IndexViewModel(){ Field02 = x.Field02, Field04 = x.Field04, ..... }.ToList(); -
@MatthewWhited 内存。 ps:我的例子比实际应用要简单得多。
-
感谢@StephenMuecke。对于本示例,在没有第三方软件包(如 AutoMapper)的情况下尝试并运行良好。
标签: c# asp.net-mvc model-view-controller asp.net-core