2016-06-07 20 views
0

我有2個表,我想知道標記爲IsCkecked = true的記錄中有多少表中沒有數據。 然後,我需要將它們標記爲false,以便它們再次獲得proses。我怎樣才能以快速的方式比較表柱,2表

第二個程序正在處理所有Table1記錄並將數據保存到Table2。

表1 90.000記錄 -Id -IsChecked -OtherData

表2 60.000記錄 -Id - 數據 -OtherData

我有這樣的代碼,它確實把工作做好,但它的太慢了。比較60k到90k,必須有更聰明的方法? 我該如何做得更好?

我可以使用EF而不是Linq嗎?

using DAL; 
using System; 
using System.Linq; 

public class ReadData 
{ 
DataModelContainer model; 

public static void Main() 
{ 
new ReadData(); 
Console.WriteLine("Done"); 
Console.ReadLine(); 
} 

ReadData() 
{ 
this.model = new DataModelContainer(); ; 

var idRecord = this.model.IdListSet.Where(x => x.IsChecked == true).ToList(); //90.000 Table1 
var record = this.model.CompRegSet.Where(z => z.HtmlRecord != null).ToList(); //60.000 Table2 
Console.WriteLine("This many ID's are marked: " + idRecord.Count); 
Console.WriteLine("This many have data: " + record.Count); 
Console.ReadLine(); 

int i = 0; 
foreach (var item in record) 
{ 
    foreach (var ids in idRecord) 
    { 
     if (item.Id == ids.Id) 
     { 
      i++; 
      ids.IsChecked = false; 
      this.model.SaveChanges(); 
     } 

    } 
} 

Console.WriteLine(i); 

}  
} 
+0

你的方法看起來很合理,是不是很慢?或者你想最小化代碼? –

+0

如果您按ID號排列了兩個列表,那麼您可以使用for循環而不是foreach - 並且不需要從內部循環的開始處開始。 – PaulF

+0

個人而言,對於這種批量更新方案,我會寫一個'update' SQL語句,並在兩個表之間進行適當的連接,然後運行它。 – sstan

回答

1

EF並未優化以讀取和更新上千條記錄。除此之外,您不得不擔心日益增長的對象緩存,大量網絡往返等等。有些方法可以調整它,但使用EF可能永遠無法實現令人滿意的性能。

在這些情況下,我認爲使用原始SQL是合理的,這樣可以讓數據庫一次執行整個操作。如果你喜歡,你甚至可以將SQL包裝在存儲過程中。

在這種情況下,你可能會寫一個UPDATE聲明,可能是這個樣子:

update a 
    set a.IsChecked = 0 
    from IdList a 
where a.IsChecked = 1 
    and exists (select null 
       from CompReg b 
       where b.HtmlRecord is not null 
        and b.Id = a.Id) 

如果您至少有CompReg.Id定義的索引,你應該從這個非常不錯的表現。

+0

我想集中精力考慮這個問題,謝謝。會試試這個。 – Hafsteinn