2017-04-22 56 views
1

下面我有此查詢:的System.OutOfMemoryException LINQ的加入

var data = (from ftr in db.TB_FTR 
      join mst in db.TB_MST on ftr.MST_ID equals mst.MST_ID 
      join trf in db.TB_TRF on mst.TRF_ID equals trf.ID 
      select new TRFData 
      { 
       City = ftr.FTR_CITY, 
       County = ftr.FTR_COUNTY, 
       Type = trf.TRF_TYPE 
      }).ToList(); 

TB_FTR表包含300萬行,TB_MST有1,100,000行和TB_TRF有340行。我怎樣才能使這個連接工作?有沒有一個技巧或解決方法呢?謝謝。

+2

你真的* *需要的所有行?沒有'where'子句? –

+2

爲什麼預先使用'ToList'? – shahkalpesh

回答

5

調用ToList您強制執行查詢,並且您要求全部將查詢的數據加載到List中的內存中。您可以使用流式方法,而不是像您一樣緩存,您可以一次獲得一個元素,或者甚至更好,您可以使用分頁方法獲取前100個記錄,然後使用接下來的100條記錄(在另一個請求上)等等等等。

var items = (from ftr in db.TB_FTR 
      join mst in db.TB_MST on ftr.MST_ID equals mst.MST_ID 
      join trf in db.TB_TRF on mst.TRF_ID equals trf.ID 
      select new TRFData 
      { 
       City = ftr.FTR_CITY, 
       County = ftr.FTR_COUNTY, 
       Type = trf.TRF_TYPE 
      }); 

foreach(var item in items) 
{ 
    // .. 
} 

尋呼

var pageSize = 100; 
var pageNumber = 1; 

var first100Items = items.Skip(pageSize*PageNumber) 
         .Take(paeSize) 
         .ToList();