2014-09-02 38 views
1

我想映射我的模型與視圖模型,我想這不是最有效的方法。這裏是代碼:映射列表<T>到ASP.NET MVC5模型

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();會導致性能問題,因爲我每次都創建一個新對象? 請指教...

+4

看看[AutoMapper(HTTPS: //github.com/AutoMapper/AutoMapper)。 – 2014-09-02 05:10:39

+2

製作havvViewModel的新實例不會產生性能問題,因爲它確實非常快。 – labilbe 2014-09-02 07:40:03

回答

1

您的代碼寫入的方式,從性能的角度來看,確實沒有任何問題。創建一個新對象是一個相對便宜的操作(假設構造函數中沒有任何工作正在進行)並且創建30個對象沒有什麼值得關注的。

如果你想要你可以讓你的代碼linq-y。這會不會真的會影響性能,但是看起來很酷:)

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

由於@labilbe評論說,除非你正在構建成千上萬的對象在循環中,其將立即執行。我的選擇是讓每個「畫面」一個視圖模型(大致),如果我有渲染大廳列表的頁面,我撰寫視圖模型像

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(); 
    } 
} 
+0

模型不應該從數據庫加載它們自己。這是控制員的工作。 – 2014-09-02 12:29:06

+0

我經常聽說這種方法,但從未親自看到它的好處。我只想讓我的Controller將路由映射到ViewModel,並在這些ViewModel上執行最小公共方法。 – Graham 2014-09-02 12:32:36

+0

我們可能應該在這裏討論這個話題:http://stackoverflow.com/questions/13951445/yes-or-no-should-models-in-mvc-contain-application-logic#13952171。爲了這個問題,這不是特別相關。 – 2014-09-02 13:23:49