2012-04-18 165 views
0

我檢索兩個不同的倉庫數據:LINQ查詢優化

 List<F> allFs = fRepository.GetFs().ToList(); 
     List<E> allEs = eRepository.GetEs().ToList(); 

現在我需要加入他們的行列,所以我做了以下內容:

 var EFs = from c in allFs.AsQueryable() 
         join e in allEs on c.SerialNumber equals e.FSerialNumber 
         where e.Year == Convert.ToInt32(billingYear) && 
         e.Month == Convert.ToInt32(billingMonth) 
         select new EReport 
         { 
          FSerialNumber = c.SerialNumber, 
          FName = c.Name, 
          IntCustID = Convert.ToInt32(e.IntCustID), 
          TotalECases = 0, 
          TotalPrice = "$0" 
         }; 

我怎樣才能讓這個LINQ查詢更好,所以它會跑得更快?我將不勝感激任何建議。

感謝

+0

什麼'fRepository'和'eRepository'?他們返回什麼? – 2012-04-18 20:09:02

+6

你爲什麼要做「ToList()」?這將立即執行查詢並返回allFs和allEs。 – Robaticus 2012-04-18 20:10:54

+0

對不起,他們返回IQueriable 和IQueriable s – Sev 2012-04-18 20:11:10

回答

5

除非你能創建一個包含數據的兩件,這將是一個遠遠首選解決方案一個倉庫,我可以看到下面的東西可能加快這一進程。

  1. 既然找你總是過濾所有的E公司通過月份和年份,你應該做的是對的IQueryable調用ToList之前,這樣你減少E公司數目的連接(可能很大)
  2. 既然你只使用E和F中的字段子集,可以使用匿名類型來限制要傳輸的數據量
  3. 根據您從F檢索的序列號數量,可以通過序列號篩選E數據庫(反之亦然)。但是,如果大多數serialnumbers的是兩組在意料之中,並沒有真正幫助你更進一步

原因,你可能不能夠將庫合二爲一可能是因爲數據是從哪裏來的兩個獨立的數據庫

的代碼,與上面提到的點1和2更新將類似於此:

var allFs = fRepository.GetFs().Select(f => new {f.Name, f.SerialNumber}).ToList(); 

int year = Convert.ToInt32(billingYear); 
int month = Convert.ToInt32(billingMonth); 

var allEs = eRepository.GetEs().Where(e.Year == year && e.Month == month).Select(e => new {e.FSerialNumber, e.IntCustID}).ToList(); 


var EFs = from c in allFs 
    join e in allEs on c.SerialNumber equals e.FSerialNumber 
    select new EReport 
    { 
     FSerialNumber = c.SerialNumber, 
     FName = c.Name, 
     IntCustID = Convert.ToInt32(e.IntCustID), 
     TotalECases = 0, 
     TotalPrice = "$0" 
    }; 
+0

不能謝謝你。謝謝 – Sev 2012-04-18 22:13:54

+0

只是好奇...它快多少:) – jessehouwing 2012-04-19 07:02:30