我怎么能加快这个查询linq请?

时间:2016-01-11 09:45:10

标签: c# asp.net linq high-availability

我想更快地在这个方法中进行LINQ查询:

public string GeneraCodiceListaEventi(DateTime data)
{
    string codice = String.Empty;

    string[] range1 = new string[] { "08:00", "08:30", "09:00", "09:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00" };
    string[] range2 = new string[] { "08:29", "08:30", "09:29", "09:59", "10:29", "10:59", "11:29", "11:59", "12:29", "12:59", "13:29", "13:59", "14:29", "14:59", "15:29", "15:59", "16:29", "16:59", "17:29", "17:59", "18:29", "18:59", "19:29", "19:59", "20:29" };

    using (DatabaseDataContext contestoDB = new DatabaseDataContext())
    {
        contestoDB.ObjectTrackingEnabled = false;

        for(int i=0; i<25; i++)
        {
            var eventi = (from db in contestoDB.Eventi
                          where db.DataPrenotazione.Date == data.Date && (db.DataPrenotazione.TimeOfDay >= TimeSpan.Parse(range1[i]) && db.DataPrenotazione.TimeOfDay <= TimeSpan.Parse(range2[i]))
                          select new
                          {
                              ID = db.ID,
                              IDCliente = db.IDCliente,
                              Note = db.Note,
                              Ore = db.DataPrenotazione.ToShortTimeString()
                          });

            if (eventi.Any())
            {
                codice += "<li><span class='ora'>" + range1[i] + "</span><input type='checkbox' id='item-" + GetNumItem(range1[i]) + "'/><label for='item-" + GetNumItem(range1[i]) + "'>Espandi</label><ul>";

                foreach (var e in eventi)
                {
                    codice += "<li class='app'> " + e.Ore + " - " + GetNominativoClienteDaID(e.IDCliente) + CheckNota(e.Note);
                }

                codice += "</ul></li>";
            }
            else
            {
                codice += "<li><span class='ora'>" + range1[i] + "</span>" + noapp + "</li>";

            }
        }

    }

    return codice;
}

在这个函数中,我将构建一个字符串,使用ajax发送到html并在浏览器中显示。但是如何让查询更快?还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

我可以给你至少2个建议让这个方法更快地执行:

1)而不是使用&#39; string codice = String.Empty;&#39;使用StringBuilder,如下所示:&#39; StringBuilder longString = new StringBuilder();&#39; 您可能需要将System.Text添加到代码文件顶部的使用引用。 StringBuilder比使用普通字符串要快得多,因为很多原因你可以在这里阅读: String vs. StringBuilder

2)您应该创建2个TIMESPANS数组,而不是使用2个字符串数组然后解析这些字符串EACH TIME You循环到Timespan对象。目前,您将字符串转换为时间跨度2倍(2个数组)* 25倍(您的循环),因此,这些是您不需要做的50次转换。

这是您可以稍微优化代码的方法。

然后,为了优化数据库访问,您应该只对所有结果进行1次查询,然后构建html,通过代码拆分结果。 更多查询=更多时间

答案 1 :(得分:0)

除了3dd之外,这个查询的速度几乎与您的C#代码无关,而且与数据库有关。 如果Eventi和DataPrenotazione都很大且未正确编入索引,那么查询将运行缓慢。最好在SQL中进行探索,并使用数据库提供的任何工具进行分析,以便了解查询性能。