【问题标题】:Mapping List<T> to a model in ASP.NET MVC5将 List<T> 映射到 ASP.NET MVC5 中的模型
【发布时间】:2014-10-26 07:05:25
【问题描述】:

我正在尝试将我的模型与视图模型进行映射,我想这不是最有效的方法。代码如下:

List<hall> allHalls = db.halls.Take(30).ToList();
List<HallViewModel> HVMLIST = new List<HallViewModel>();

int process = 0;

foreach(var hall in allHalls)
{
    havvViewModel HVM = new havvViewModel();
    HVM.name = hall.name;
    ...

}

有没有更有效的方法来做到这一点?因为我每次都在创建一个新对象,所以在 for 循环中调用 havvViewModel HVM = new havvViewModel(); 会产生性能问题吗? 请指教...

【问题讨论】:

  • 看看AutoMapper
  • 创建一个新的 havvViewModel 实例不会产生性能问题,因为它真的非常非常快。

标签: c# asp.net-mvc asp.net-mvc-5


【解决方案1】:

正如@labilbe 评论的那样,除非您在该循环中构建成千上万个对象,否则它将立即执行。我的偏好是每个“屏幕”(大致)有一个 ViewModel,如果我有一个呈现大厅列表的页面,我会像

那样编写 ViewModel
public class HallListing : BaseViewModel
{
     private List<hall> halls;
     public void LoadData() 
     {
          this.halls = base.db.halls.Take(30).ToList();
     }
}

abstract class BaseViewModel 
{
     protected DataContext db { get; private set; }
     public BaseViewModel() 
     {
          this.db = new DataContext();
     }
}

【讨论】:

  • 模型不应该从数据库中加载自己。这是控制器的工作。
  • 我经常听到有人说这种方法,但从来没有亲眼看到它的好处。我只希望我的控制器将路由映射到 ViewModel,并在这些 ViewModel 上执行最少的公共方法。
  • 我们或许应该将关于该主题的讨论移至此处:stackoverflow.com/questions/13951445/…。对于这个问题,它并不是特别相关。
【解决方案2】:

从性能的角度来看,您的代码编写方式确实没有任何问题。创建一个新对象是一个相对便宜的操作(假设在构造函数中没有做任何工作),创建 30 个对象没什么好担心的。

如果你愿意,你可以让你的代码 linq-y。这不会对性能产生真正的影响,但看起来很酷:)

return 
    db.halls
      .Take(30)
      .Select(h => 
          new havvViewModel
          {
              Name = h.name
          });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多