2013-06-12 71 views
1

我在LINQ中爲兩個表執行連接操作,但大部分時間都是爲小數據集執行。以下是LINQ查詢在LINQ中高效加入查詢

for (int i = 0; i <= 200; i++) 
{ 
     var test = from r1 in dtRowForNode.AsEnumerable() 
       join r2 in dtFileRowForNode.AsEnumerable() 
       on r1.Field<int>("Lng_Upload_Id") equals r2.Field<int>("Lng_Upload_Id") 
       where ((r1.Field<string>("Txt_Called_Number") == "999") || r1.Field<string>("Txt_Calling_Number") == "888") 
       select r2.Field<string>("Txt_File_Name"); 

     string[] str = test.Distinct().ToArray();     
} 

在這裏,我有兩個DataTable dtRowForNode有7500左右行和另一種是dtFileRowForNode一個只有12行。現在

我去爲這個循環查詢200次,花費近6-7秒即可完成for循環。爲什麼它要花這麼多時間來處理這麼小的數據集。

我應該用不同的方式寫這個嗎?

+1

你真的需要的'AsEnumerable()'? –

+0

@MthetheWWatson我無法得到你的觀點先生! –

+0

AsEnumerable()遍歷每個項目並將其添加到Enumerable變量 –

回答

1

看看以下運行爲您帶來任何更快:

var rowForNode=dtRowForNode.AsEnumerable().Select(dt=>new { 
    Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"), 
    Txt_Called_Number=dt.Field<string>("Txt_Called_Number"), 
    Txt_Calling_Number=dt.Field<string>("Txt_Calling_Number")}).ToList(); 

var fileRowForNode=dtFileRowForNode.AsEnumberable().Select(dt=>new { 
    Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"), 
    Txt_File_Name=dt.Field<string>("Txt_File_Name")}).ToList(); 

for (int i = 0; i <= 200; i++) 
{ 
     var test = from r1 in rowForNode 
       join r2 in fileRowForNode 
       on r1.Lng_Upload_Id equals r2.Lng_Upload_Id 
       where (r1.Txt_Called_Number == "999" 
        || r1.Txt_Calling_Number == "888") 
       select r2.Txt_File_Name; 

     string[] str = test.Distinct().ToArray();     
} 
+0

相同的結果。性能沒有變化! –

+0

然後有些事情是奇怪的,因爲我只是運行了相同的測試,一些虛擬數據在第一個表中有7718條記錄,第二條記錄中有12條記錄,整個事情需要0.046秒。 –

+0

我剛剛在變量創建中添加了一個.ToList(),以確保LINQ不會在每個循環中重新創建它們。我的測試數據實際上並不在數據表中,我直接創建了外部變量。這可能是不同之處。 –

0

從哪裏數據進入這兩個數據表。如果它來自數據庫,則嘗試使用IQueryable或IEnumerable或IList。這些會更快,並且將LazyLoading選項設置爲False。首先獲取數據到var或IQueryable的IEnumerable的或IList的或再申請以下查詢聯接:

IQueryable<string> testList = (from p in dbContext.test 
          join c in dbContext.test1 on p.testId equals c.test1Id 
          select c.test1); 

我希望這會幫助你。 :)