2016-01-16 50 views
0

我剛剛設法將數據從一個表加載到另一個表中,並將其返回給視圖,所有工作都很好。MVC將兩個外部表合併成一個視圖非常慢

不幸的是通過我的學習過程中,未能理解與迴歸兩種模式有一種觀點認爲其他職位,並從使用MVC 5 Tutorial by Rick Anderson

我控制器正在採取永遠創造我的「合併」數據表模型,並將其返回這個觀點,同樣當我操縱視圖時,它又一次貫穿了整個過程,這是脛骨上的一次重大嘗試。

我有一個範型號不保存其GPRS單元的SIM或IMEI號碼,這是存儲在一個Assett表中,它們都不是索引鏈接的(如果這是正確的措辭)。我希望從Assett Table中返回查看完整的Vans列表以及IMEI和SIM卡號碼。

範型號

[MetadataType(typeof(VanViewModel))] 
public partial class Vans__ 
{ 
    public string IMEI { get; set; } 
    public string SimNo { get; set; } 
} 

public class VanViewModel 
{ 
    [Required] 
    public int AssetID { get; set; } 

    [Required] 
    [Display(Name = "Chassis Number")] 
    public string Van_Serial_Number { get; set; } 

    [Required] 
    [Display(Name = "Seller Dealer ID")] 
    public int Dealer_ID { get; set; } 
} 

資產模型

public partial class Asset 
{ 
    public int AssetID { get; set; } 
    public string AssetName { get; set; } 
    public string SIM { get; set; } 
    public string IMEI { get; set; } 
} 

控制器

public ActionResult Index() 
{ 
    List<Asset> Assets = new List<Asset>(); 
    List<Vans__> Vans = new List<Vans__>(); 
    Vans = db.Vans__.ToList(); 
    foreach (var myVan in Vans) 
    { 
     int assetIDtoSearch = myVan.AssetID; 
     Asset myAsset = dbasset.Assets.Where(m => m.AssetID == assetIDtoSearch).Single(); 
     myVan.IMEI = myAsset.IMEI; 
     myVan.SimNo = myAsset.SIM; 
    } 
    // Query Asset Table to get IMEI and SIM Number 
    return View(db.Vans__.ToList()); 
} 

我的控制器是反應慢我明白其中的道理,我只想感謝關係的一些指導到我的代碼來幫助我理解一種方式來返回這兩種模型並將它們排序她的觀點。如果有人可以花時間突出一種方法來加快我的代碼或如何讓我的兩個模型通過正確的視圖,這將非常感激。

從斯蒂芬的建議我意識到我的控制器可能只是返回視圖的視圖。我現在已經實現了這一點,但仍然可以根據請求生成這樣的模型,這有助於更快地返回視圖。

這裏是我的更新控制器

 public ActionResult Index() 
    { 
     // Below code is too slow itterates through tables and populates them very slowly - can not release tbh. 
     List<Asset> Assets = new List<Asset>(); 
     List<Vans__> Vans = new List<Vans__>(); 

     Vans = db.Vans__.ToList(); 

     foreach (var myVan in Vans) 
     { 
      int assetIDtoSearch = myVan.AssetID; 
      Asset myAsset = dbasset.Assets.Where(m => m.AssetID == assetIDtoSearch).Single(); 
      myVan.IMEI = myAsset.IMEI; 
      myVan.SimNo = myAsset.SIM; 
     } 

     return View(Vans); // Do not need to return db.vans__.tolist() as Vans contains this already. 
    } 

我修改了標題爲實現我的數據表是在不同的數據庫。 如果有人可以請指出我正確的方向來加快我的代碼或如何加入兩個表的好例子,所以我可以訪問一個視圖中的數據,將不勝感激。

+0

您首先使用'Vans = db.Vans __。ToList();'查詢數據庫以獲取所有'Vans__'然後爲集合中的每個'Vans__'創建另一個查詢以獲取其「Asset」。然後,你扔掉你已經完成的所有事情,並調用數據庫來再次獲得'Vans__'並將其返回到視圖。除了'返回View(db.Vans __。ToList())'之外,刪除'Index()'方法中的每一行。 '因爲它毫無意義。 –

+0

@StephenMuecke謝謝你,我現在已經將Vans返回給視圖。您的建議刪除索引中的所有內容對我來說並不合適。索引模型中的內容是創建包含另一個數據表中的兩列的聯合模型,然後將新模型返回到視圖,還是缺少一些內容? –

+0

在編輯之前它確實有意義。如果您的模型不包含導航屬性,則使用linq'.Join()'。 –

回答

0

在你的情況下加載緩慢的主要原因是連接到數據庫的循環。從我看到你只需要車的ID,所以在你的控制器,在代替:

Vans = db.Vans__.ToList(); 

嘗試使用LINQ查詢或LAMDA相當於在此以下行:

Vans = db.Vans__.Select(p => p.AssetID).ToList(); 

 foreach (var myVan in Vans) 
    { 
     int assetIDtoSearch = myVan.AssetID; 
     Asset myAsset = dbasset.Assets.Where(m => m.AssetID == assetIDtoSearch).Single(); 
     myVan.IMEI = myAsset.IMEI; 
     myVan.SimNo = myAsset.SIM; 
    } 

與此:

01所以現在,爲下一個,在編寫循環代替您可以通過更換這個循環傳遞另一個數據庫查詢
var assets = dbasset.assets.where(m => Vans.Contains(m.AssetID)).ToList(); 

var assets = dbasset.assets.where(m => Vans.Select(p => p.AssetID).Contains(m.AssetID)).ToList(); 

- 這兩條線應該工作之一,所以只是嘗試他們都在你的代碼,看看哪一個的吧:)

,這會給你的列表所有這些資產。我建議你再次使用投影,只需使用.Select()就可以得到所需的字段,如前所示。

另外,看看這個視頻:http://youtube.com/watch?v=GmyVMSf4DtE&feature=youtu.be它解釋了更多關於優化您的查詢和爲什麼你應該這樣做。