2014-02-22 42 views
0

Im初學者,我想知道我在做什麼是對的,因爲我正在排隊等待350個記錄的單個表,並且花了將近一分鐘的時間來顯示!我認爲我做錯了什麼。 所以這就是我如何做它:它是使用實體框架的正確方法嗎?

裏面的代碼類:SPOT

/// <summary> 
    /// Return The City Of this Spot 
    /// </summary> 
    /// <returns>City Of The Spot</returns> 
    public City GetCityOfThisSpot() 
    { 
     City value; 
     using (var ctx = new GhanDBEntities()) 
     { 
      var firstOrDefault = ctx.Spots.FirstOrDefault(s => s.IdSpot == IdSpot); 
      var city = firstOrDefault.City; 
      value = city; 
     } 
     return value; 
    } 

,然後在我的winform我用一些有生命的:

CODE在WinForm:

List<City> listOfCities = new List<City>(); 
     foreach (var spot in listOfspot) 
     { 
      listOfCities.Add(spot.GetCityOfThisSpot); 
     } 

我想我不應該這樣做,因爲foreach Spot我正在創建一個上下文並摧毀它!你能糾正我嗎?

回答

1

DbContext是一個輕量級的類,它不會爲每個查詢創建問題。但是對於WinForms應用程序來說,這只是一個矯枉過正的問題 - 您可以在整個應用程序生命週期中重複使用同一個上下文實例注 - 對於Web應用程序,您通常創建上下文的實例,在相同的請求期間重複使用上下文的實例。

因此,您不需要在WinForms應用程序中部署上下文。你真正需要的這裏市navigation property在現貨實體:

public virtual City City { get; set; } 

在這種情況下,實體框架將lazy-load城市時,你會需要它(記住 - 保持不同情境下不配置)。此外,如果你想獲得很多景點的城市,然後就去做城市eager-loading當加載點:

var spots = ctx.Spots.Include(s => s.City); 

在這種情況下,實體框架將加入兩個表並返回與已加載的城市景點。

在這兩種情況下獲得的斑點的城市將是這樣的:

List<City> listOfCities = listOfspot.Select(s => s.City).ToList(); 

我也建議你閱讀喬恩浩文章Do I always have to call Dispose() on my DbContext objects?那裏你可以找到迭戈維加(對實體框架的高級SDE鉛)響應指出在常見情況下(如果您不手動打開數據庫連接),則不需要在DbContext上調用Dispose。

3

我可以給你幾個建議:

  1. 您使用FirstOrDefault,但不檢查null,我認爲這將是更好地使用查找,單個或第一個,或添加null(你贏了」噸得到任何與此速度效益)

  2. 最有可能你會得到批量要求速度的好處:

    var ids = listOfspot.Select(p => p.IdSpot).ToList(); 
    var listOfCities = ctx.Spots.Where(p => ids.Contains(p.IdSpot)) 
             .Select(p => p.City).ToList(); 
    
1

DbContext在這種情況下不是問題。

GetCityOfThisSpot()

正在作出分貝查詢,在WinForm代碼運行查詢350倍...

聯合起來讓這個更快。

相關問題