2013-04-04 79 views
0

我一直在試圖更新一個擁有100萬條記錄並將其字段的NULL值替換爲空字符串(「」)的表。 Foreach和似乎需要很長時間。我花了1分鐘更新3 000條記錄。有更簡單的方法來更新表使用LINQ或可能的程序?LINQ更新表用EmptyString替換NULL 100萬條記錄

這是我此刻的使用,但它永遠需要,我可能需要經常這樣做:

foreach (MG_Backup item in mg) 
{ 
    lblAllNulls.Text +="<br />ID:"+item.ID+" "; 
    if (item.Name == null) 
    { 
     item.Name = ""; 
     lblAllNulls.Text += "Name "; 
    } 
    if (item.Company == null) 
    { 
     item.Company = ""; 
     lblAllNulls.Text += "Company "; 
    } 
    if (item.Addr1 == null) 
    { 
     item.Addr1 = ""; 
     lblAllNulls.Text += "Addr1 "; 
    } 
    if (item.Addr2 == null) 
    { 
     item.Addr2 = ""; 
     lblAllNulls.Text += "Addr2 "; 
    } 
    if (item.FullAddress == null) 
    { 
     item.FullAddress = ""; 
     lblAllNulls.Text += "FullAddress "; 
    } 
    if (item.City == null) 
    { 
     item.City = ""; 
     lblAllNulls.Text += "City "; 
    } 
    //saves the changes 
    db.SaveChanges(); 
} 
+0

這聽起來像一個存儲過程的工作。 – asawyer 2013-04-04 12:37:47

+2

你不能通過SQL更新語句來完成嗎? – Richard 2013-04-04 12:37:58

+1

但我有5個字段,我需要檢查它們是否爲空,並且它們中的任何一個都不得在同一時間爲null。一個字段可能爲空,下一個記錄可能有另一個字段爲空,所以基本上我將不得不運行5個更新語句超過100萬條記錄..這將需要很多時間..我認爲... – Nathan 2013-04-04 12:41:00

回答

1

你沒有顯示你的LINQ語句,但是從你的代碼,我認爲你做了這樣的事情:

var mg = from mgs in <Table> 
     select mgs; 
//loop you showed 

這使得無論他們是否有更新或沒有的LINQ來獲取所有項目。


取決於有多少你的記錄居然有更新時,您會快很多像這樣的東西:

var mg = from mgs in <Table> 
     where mgs.Name == null || mgs.Company == null // || and so on and so forth 
     select mgs; 
//loop you showed 
+1

這正是我剛纔所做的,我回來發佈我的解決方案,但在這裏你有相同的解決方案。做你也建議把我的記錄從100萬降低到10K ..不錯:)最佳答案... – Nathan 2013-04-04 13:04:24

1

至於數據庫的代碼,你單獨更新每個記錄。嘗試將SaveChanges()移出循環。或者用計數器來保護它,並且只保存它每N個記錄。

您的lblAllNulls代碼顯示需要StringBuilder的經典模式:

foreach (MG_Backup item in mg) 
{ 
    lblAllNulls.Text +="<br />ID:"+item.ID+" "; 
    ... 
} 

字符串被foreach循環連接起來。 lblAllNulls.Text必須不斷重新分配一個複製。幾千輪之後,這會變得非常緩慢。

+1

我不是當你執行數百萬次數據庫往返時,肯定你會看到很多優化字符串分配的差異。 – asawyer 2013-04-04 12:44:47

+0

@asawyer - 對於1M記錄它會計數。但實際上它不會接近解釋3分鐘記錄的1分鐘。 – 2013-04-04 12:48:05

+0

當然,並且介意你我從來沒有測試過這個,但是在我看來,在等待數據庫調用返回時,GC會有很多停機時間運行。 – asawyer 2013-04-04 12:49:21