2012-04-25 83 views
2

不幸的是,我維護一個系統,沒有考慮一旦系統有數百萬條記錄會發生什麼。加快linq /實體結果的返回

我遇到的問題是當前編寫代碼的方式,主要是GetList方法實際上返回數據庫中的每條記錄,並且過濾在getfull方法中完成。

當我嘗試這樣做。凡我tryed由然而經過調整的id到的GetList方法改變這種(A => a.Id == journalid) 我得到這個錯誤

不能隱轉換型 'System.Linq.IQueryable爲' System.Data.Objects.ObjectQuery

public Adjustment GetFull(int id) { 
      var result = GetList(id).FirstOrDefault(ja => ja.Id == id); 
      if(result == null) { 
       throw new InvalidOperationException(
        String.Format(" Adjustment with Id={0} not found.", id) 
       ); 
      } 
      return LoadFullActivities(result); 
     } 


     private IQueryable<Adjustment> GetList(int journalid) { 
      return GetList(journalid,"Original", "Activities", 
       "Original.Employee", "Original.Employee.EmployeeType", 
       "Original.Employee.WorkType", "Original.Employee.Department", 
       "Original.Activities", "Original.Status", 
       "Original.Approver", "Status"); 
     } 

     private IQueryable<Adjustment> GetList(int journalid, params string[] includes) { 
      var tempResult = dataContext.AdjustmentSet; 
      foreach (var property in includes) { 
       tempResult = tempResult.Include(property).Where(a=>a.Id == journalid) ; 
      } 
      return tempResult; 
     } 

回答

5

這會修正這個錯誤

private IQueryable<Adjustment> GetList(int journalid, params string[] includes) { 
     var tempResult = dataContext.AdjustmentSet.AsQueryable(); 
     foreach (var property in includes) { 
       tempResult = ((ObjectQuery<Adjustment>)tempResult).Include(property); 
     }    
     return tempResult.Where(a=>a.Id == journalid); 
     } 

其中包括減慢查詢速度。由於查詢將只獲取一行(並且由於包含而進行其他連接),所以我不認爲性能如此之慢。要提高性能,請爲每個外鍵添加索引。我猜a.Id已經有了一個聚集索引。

+0

嗯這仍然不會解決問題wehre tempResult = tempResult.Include(屬性)加載所有的記錄或將它? – 2012-04-25 17:42:02

+0

它不加載所有記錄。只有某些方法加載ToList(),ToArray(),First等記錄。包含保留延遲執行原理 – 2012-04-26 08:22:59

+0

這實際上沒有工作。 .includes仍然調用數據庫中的所有數據,然後進行過濾。我其實想阻止從數據庫返回所有數據 – 2012-04-30 02:53:04