2012-06-05 120 views
0

下面你看到我的日历的代码为一个网站,问题是这个代码需要大约8-10秒加载。如果你们中的任何人都能看到一种方法来尽量减少加载时间,我将不胜感激。在日历上减少加载时间

public static IEnumerable<DateTime> AllDatesInMonth(int year, int month) 
    { 
     foreach (var day in Enumerable.Range(1, DateTime.DaysInMonth(year, month))) 
     { 
      yield return new DateTime(year, month, day); 
     } 
    } 

    public void ForeachDayInMonth(int year, int month, SqlConnection connection) 
    { 
     int day; 
     int count; 
     double divHeight; 

     lbl_Month.Text += "<table class=\"Month\">"; 
     foreach (DateTime date in AllDatesInMonth(year, month)) 
     { 
      day = int.Parse(date.ToString().Substring(0, 2)); 
      count = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection).Count; // Creates a sql select statement 

      lbl_Month.Text += "<tr>" + 
       "<td style=\"height: 30px; width: 70px;"; 

      if (date.Date == DateTime.Today) 
      { 
       lbl_Month.Text += "-webkit-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "-moz-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);"; 
      } 

      lbl_Month.Text += "\">"; 

      if (count != 0) 
      { 
       divHeight = 100/count; 

       foreach (Begivenheder b in Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection)) // creates a sql select statement 
       { 
        lbl_Month.Text += "<div style=\"background-color: " + b.begivenhed.type.TypeFarve + "; height: " + divHeight + "%;\">" + 
         "<a href=\"KalenderEvent.aspx?Event=" + b.begivenhed.ID + "\">"; 
        if (b.begivenhed.Navn.Length > 9) 
        { 
         lbl_Month.Text += b.begivenhed.Navn.Remove(9) + "..."; 
        } 
        else 
        { 
         lbl_Month.Text += b.begivenhed.Navn; 
        } 
        lbl_Month.Text += "</a>" + 
         "</div>"; 
       } 
      } 

      lbl_Month.Text += "</td>" + 
       "</tr>"; 
     } 
     lbl_Month.Text += "</table>"; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     string year; 

     if (Request.QueryString["Year"] == null) 
     { 
      year = DateTime.Today.Year.ToString(); 
     } 
     else 
     { 
      year = Request.QueryString["Year"]; 
     } 

     Page.Title += " - Kalender " + year; 

     SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["Database"]); 
     connection.Open(); 
     try 
     { 
      Year(int.Parse(year), connection); 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 

    private void Year(int year, SqlConnection connection) 
    { 
     string thisYear = year.ToString(); 
     int lastYear = year - 1; 
     int nextYear = year + 1; 

     lbl_Year.Text = "<div>" + 
      "<a href=\"Kalender.aspx?Year=" + lastYear.ToString() + "\" id=\"LastYear\"></a>" + 
      "</div>" + 
      "<div>" + 
      thisYear + 
      "</div>" + 
      "<div>" + 
      "<a href=\"Kalender.aspx?Year=" + nextYear.ToString() + "\" id=\"NextYear\"></a>" + 
      "</div>"; 

     lbl_Month.Text = "<table>" + 
      "<tr>" + 
      "<td>"; 
     // Dage 
     lbl_Month.Text += "<p>" + 
      "</p>" + 
      "<br />" + 
      "<table>"; 
     for (int i = 1; i <= 31; i++) 
     { 
      lbl_Month.Text += "<tr>" + 
       "<td style=\"height: 30px;\">" + 
       "<p>" + 
       i.ToString() + 
       "</p>" + 
       "</td>" + 
       "</tr>"; 
     } 
     lbl_Month.Text += "</table>" + 
      "</td>"; 

     //Januar (repeats 12 times, ones for each month) 
     lbl_Month.Text += "<td>" + 
      "<p>" + 
      "Januar" + 
      "</p>"; 
     ForeachDayInMonth(int.Parse(thisYear), 1, connection); 
     lbl_Month.Text += "</td>"; 

     lbl_Month.Text += "</tr>" + 
      "</table>"; 
    } 

继承人“Begivenheder.Get_Begivenhed_By_Date”代码。

public static List<Begivenheder> Get_Begivenhed_By_Date(int år, int måned, int dag, SqlConnection connection) 
    { 
     List<Begivenheder> result = new List<Begivenheder>(); 

     using (var command = new SqlCommand("Select ID, FK_Begivenhed_ID from Begivenhed_Datoer where Dag=" + dag + " and Måned=" + måned + " and År=" + år, connection)) 
     { 
      SqlDataReader reader = command.ExecuteReader(); 
      try 
      { 
       while (reader.Read()) 
       { 
        Begivenheder b = new Begivenheder(); 
        b.Dato_ID = reader.GetInt32(0); 
        b.ID = reader.GetInt32(1); 
        b.Dato_Day = dag; 
        b.Dato_Month = måned; 
        b.Dato_Year = år; 
        result.Add(b); 
       } 
      } 
      finally 
      { 
       reader.Close(); 
      } 

      foreach (Begivenheder b in result) 
      { 
       b.begivenhed = Begivenheder.Get_Begivenhed_By_ID(b.ID, connection); 
      } 
     } 

     return result; 
    } 

我知道这是一堆代码,但我不知道如何减少它。

+0

我刚刚编辑过你的标题,因为它说与你的问题相反:) – BlackBear

+0

没有看到,谢谢^^ –

回答

2

每天的Page_Load导致CCA 30数据库查询取代string + string + string码 - 那是一个很大的开销,尝试和改造,所以你只需要跟数据库一次,如果有的话。除此之外,获得一个.NET分析器,并查看你花费的最多时间。

1

基本的字符串优化会产生很大的差异。如果您有string +=,请改为使用字符串生成器。然后当所有计算完成后,使用.ToString()方法将StringBuilder转换为一个字符串。

请参阅MSDN StringBuilder Class

还与AppendFormat方法

+2

相对于数据库命中和减少10秒页面加载的目标,这可能微不足道。 –

2

您可以通过获取整个时间间隔内的所有事件来提高性能,而不是为每个日期执行一次查询。看起来您希望在一个月内完成所有事件,因为您当前的数据模型很容易进行更改。

如果选择执行每天一个查询,加入SqlParameters给它,而不是重建一个新时代28-31品牌重复使用相同的SqlCommand

1

1)用途:代替

day = date.Day; 

day = int.Parse(date.ToString().Substring(0, 2)); 

2)将这个长的风格融入了样式表/ CSS,并用简短类= '名' 而不是:

webkit-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "-moz-box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8);" + 
        "box-shadow:inset 0px 0px 20px rgba(000,000,000,0.8); 

3)您每天拨打两次Begivenhed_By_Date:

1)  count = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection).Count; 
2) foreach (Begivenheder b in Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection)) 
could be: 
+) List<Begivenheder> hedByDate = Begivenheder.Get_Begivenhed_By_Date(year, month, day, connection); 
1.x count = hedByDate.Count; 
2.x foreach (Begivenheder b in hedByDate, connection)) 

4)至少使用StringBuilder先连接lbl_Month.Text + =字符串,然后最后分配它。

5)考虑使用Repeater控件,所以你不必像这样使用HTML代码。

6)改变它,所以你只做一次SQL查询,而不是多次。