2012-09-25 41 views
2

我們有一個帶有實體框架4.0的Web應用程序。不幸的是,當大量用戶的命中應用程序的EF引發錯誤 基礎提供失敗的開放實體框架4.0 - 底層提供商開放失敗

下面的代碼片段:

//DAL 
public IQueryable<EmployeeEntity> GetEmployeeDetail() 
{ 
    DatabaseEntities ent = new DatabaseEntities(this._connectionString); 
    IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity 
              select employee; 

    return result; 
} 

請注意上面的代碼返回IQuerable。

  1. 上面的模式可能會導致異常發生?
  2. 實體框架何時以及如何確定關閉/打開數據庫連接以及保留多久?
  3. 上述錯誤發生在哪種情況下?
  4. EF連接池的最大數量是多少,我們如何配置?
  5. 我們是否需要明確指定打開和關閉
  6. 下面的代碼是解決上述問題的最佳方法嗎?

public IQueryable<EmployeeEntity> GetEmployeeDetail() 
{ 
    using (DatabaseEntities ent = new DatabaseEntities(this._connectionString)) 
    { 
     IQueryable<EmployeeEntity> result = from employee in ent.EmployeeEntity 
              select employee;      
     return result.ToList().AsQuerable(); 
    } 
} 
+0

是否有特定原因返回'IQueryable '而不是'IEnumerable '? – RePierre

+0

@RePierre,謝謝你的回覆。 IT的現有代碼,無法更新。無論如何,有什麼區別? –

+0

區別在這裏http://stackoverflow.com/a/2876655/844006。我在問,因爲我認爲如果將實體容器封裝在'using'語句中並將結果顯示爲'IQueryable ',那麼您將遇到一些問題;某人稍後可能會執行某些操作,例如GetEmployeeDetail(),其中(e => e.Id == id)',並且執行該查詢可能會有一些問題,因爲數據上下文對象將被丟棄。 – RePierre

回答

2

ToList()調用將導致查詢到數據庫上立即運行,並因爲這是不以任何方式將您的數據庫返回的每一位員工過濾。這可能會導致您的性能問題。

但是,您不能在您的情況下將其刪除,因爲如果您直接返回IQueryable,那麼在嘗試提取結果時將處理上下文。

你既可以:

  • 改變它的工作原理,這樣的ent範圍不會結束方法返回時,沒有調用ToList()返回查詢的方式。您可以在致電ToList()之前進一步篩選IQueryable
  • 在該方法中調用ToList(),但首先篩選/限制查詢(例如,將某些參數傳遞到方法中以指定此參數)以減少從數據庫返回的行數。
+0

ToList()如何導致性能和過濾問題。由於數據將存儲在內存中。 –

+0

如果每次打電話時都會從數據庫中檢索10s/100s/1000s的員工,可能會這樣做,如果您稍後過濾清單,這可能不必要 –

相關問題