2009-10-05 85 views
0

我對數據表有成本問題。我需要用更聰明的代碼替換代碼。用於訪問數據表記錄的C#代碼優化

我有一個數據表和樣品值是這樣的:

列:ID,USER_ID,開始時間,結束時間

行樣品:1,5,08 05.10.2009:00:00,05.10 0.2009 17:00

我的僞代碼是

function something() 
    { 
    for(int i=0;i<datatable.Rows.Length;i++) 
    { 
    if(Someobject.variable.Equals(dt.Rows[i][user_id].ToString())) 
    { 
    if(Date.Compare(somevariable,dt.Rows[i][starttime].ToString())!=0) 
    { 
    //Do something 
    } 
    } 
    } 
} 

這是類似的東西。數據表有超過一千行,並且在加載asp.net頁面時,這些函數必須被調用近一千次。

所以我必須改變它。

我認爲使用字典,但它似乎只需要兩個變量。你能告訴我什麼?

編輯:

我還沒有解決問題。這是相關的代碼。提前致謝。

保護無效RadScheduler_Randevu_TimeSlotCreated(對象發件人,Telerik.Web.UI.TimeSlotCreatedEventArgs E) {

for (int i = 0; i < calismaSaatleridt.Rows.Count; i++) 
{ 
    if (RadScheduler_Randevu.SelectedView.Equals(SchedulerViewType.DayView)) 
    { 
     if (RadScheduler_Randevu.SelectedDate.ToShortDateString().Equals(Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_baslangic"]).ToShortDateString())) 
     { 
      if (e.TimeSlot.Resource.Key.ToString().Equals(calismaSaatleridt.Rows[i]["hekim_id"].ToString())) 
      { 
       if (DateTime.Compare(e.TimeSlot.Start, Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_baslangic"])) < 0 || DateTime.Compare(e.TimeSlot.End, Convert.ToDateTime(calismaSaatleridt.Rows[i]["calisma_bitis"])) > 0) 
       { 
        e.TimeSlot.CssClass = "Disabled"; 
       } 
      } 
     } 
    } 
} 

}

這是返回結果集的功能。

private DataTable calismaSaatiGetir(string yonetici_id) 
    { 
     SqlConnection connection = new SqlConnection(); 
     connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     SqlCommand command = new SqlCommand(); 
     command.CommandText = "select calisma_saati.id,kullanici.id as hekim_id,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' ' +LEFT(CONVERT(VARCHAR,calisma_saati.baslangic_saati,108),5) AS calisma_baslangic,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' '+LEFT(CONVERT(VARCHAR,calisma_saati.bitis_saati,108),5) AS calisma_bitis from calisma_saati JOIN kullanici ON kullanici.id=calisma_saati.kullanici_id WHERE yonetici_id='" + Session["yonetici"].ToString() + "' "; 
     command.Connection = connection; 
     connection.Open(); 
     SqlDataAdapter da = new SqlDataAdapter(command.CommandText, connection); 
     DataSet ds = new DataSet(); 
     da.Fill(ds, "calisma_saati"); 
     calismaSaatleridt = ds.Tables["calisma_saati"]; 
     connection.Close(); 
     return calismaSaatleridt; 
    } 

回答

5

DataTable中有超過一千行和功能上被稱爲近千倍

有你的問題。如果我正在閱讀正確的內容,那麼您將循環查看問題中未顯示的其他一些數據集合中每個項目的整個數據表。

解決這個問題的最好方式是在數據庫級別:無論你做什麼,產生這個數據表需要了解你的其他數據集,所以你可以把它考慮數據庫(和利用像索引和緩存數據)。這可能意味着編寫比您習慣的複雜得多的選擇查詢,但這是正確的方法。

如果這不是一個選項,你仍然希望以某種方式重新工作,這樣你只需要對所有事情進行一次交流。如果你使用c#,你可以通過linq查詢(甚至只是IEnumerable擴展+ lambda方法)來完成。

關於使用字典:它可能只需要兩個變量,但其中一個變量可能是一個更復雜的對象,就像表中的整個數據行一樣。無論哪種方式,爲了給您提供任何類似示例代碼,我們需要更好地瞭解其他數據的外觀以及您的預期結果。

+0

是的,我絕對同意你說,循環是真正的問題。情況是這樣的:我有一個radscheduler組件,它有一個時間段創建事件。在頁面加載時,我需要根據用戶檢查該時間段是啓用還是禁用。這個活動被稱爲近千次。所以我不能改變它。我必須做的是儘可能快地從數據表或其他東西中獲得。我明天可以粘貼示例代碼和示例數據,但現在我沒有。謝謝你的回答。 – 2009-10-05 19:09:09

+0

在這種情況下,您可能希望在獲取數據表後儘快創建一個字典,並將其保存在好的和公開的地方,以便您不必爲此返回數據庫。 – 2009-10-05 20:57:34

1

這是直接來自數據庫嗎?如果是這樣,爲什麼不直接執行查詢來獲得更具體的結果集?然後你可以使用linq在每一行上執行你的函數。

多個定義SQL: SELECT * FROM表,其中用戶ID = '1/1/2009 11:00 PM' 和 '1/1/2009下午11點21分'

的LINQ '之間鮑勃' 和開始時間:

DataTable table = getFromDb(); 
table.Rows.Cast<DataRow>().ToList().ForEach(x => RunMyFunction(x)); 

void RunMyFunction(DataRow row) 
{ 

} 
+0

是從數據庫查詢中填充數據表。實際上有一個組件的時隙,並且在時隙創建的事件中,我需要檢查用戶是否在開始時間和結束時間之間工作,所以我禁用了時隙。我不知道我可以用linq做到這一點。你能給我一個樣本嗎? – 2009-10-05 18:51:15

+0

編輯樣品 – 2009-10-05 18:56:45

0

這個怎麼樣? (如果你能把這個查詢推送到數據庫會更好,但是這比循環每一行要快)

void something(DataTable dt, myobj Someobject, DateTime somevariable) 
{ 
    string filterPattern = "user_id='{0}' AND starttime='{1}'"; 
    string filter = string.Format(filterPattern, 
            Someobject.variable, 
            somevariable); 
    DataRow[] rows = dt.Select(filter); 

    foreach (DataRow row in rows) 
     DoSomething(row); 
} 
void DoSomething(DataRow row) 
{ 
} 
public class myobj 
{ 
    public string variable { get; set; } 
} 
+0

謝謝,我會試試看。 – 2009-10-05 19:12:24