C# 我怎样才能加快这个查询的速度?

C# 我怎样才能加快这个查询的速度?,c#,asp.net,linq,high-availability,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

我想使此方法中的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;
}
公共字符串generacodedicelistaeventi(日期时间数据)
{
string codice=string.Empty;
字符串[]范围1=新字符串[]{“08:00”,“08:30”,“09:00”,“09:30”,“10:00”,“10:30”,“11:00”,“11:30”,“12:30”,“13:00”,“13:30”,“14:00”,“14:30”,“15:00”,“15:30”,“16:30”,“17:30”,“18:30”,“19:30”,“20:00”};
字符串[]范围2=新字符串[]{“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:29”,“15:29”,“15:59”,“16:59”,“17:29”,“17:59”,“18:29”,“18:59”,“19:29”,“20:29”};
使用(DatabaseDataContext-context-context-context=new-DatabaseDataContext())
{
contesticoDB.ObjectTrackingEnabled=false;

对于(int i=0;i=TimeSpan.Parse(range1[i])&&db.DataPrenotazione.TimeOfDay我可以为您提供至少2条建议,以加快此方法的执行速度:

1) 不要使用“string codice=string.Empty;”,而是使用一个StringBuilder,如下所示:“StringBuilder longString=new StringBuilder();” 您可能需要使用代码文件顶部的引用将System.Text添加到。StringBuilder比使用公共字符串快得多,因为您可以在此处阅读以下内容:

2) 与每次循环到Timespan对象时使用2个字符串数组并解析这些字符串不同,您应该创建2个Timespan数组。目前,您正在将字符串转换为Timespan 2次(2个数组)*25次(您的循环),因此,这50次转换您不需要执行

这就是您可以稍微优化代码的方式

然后,为了优化db访问,您应该只对所有结果执行一次查询,然后构建html,通过代码分割结果。
更多的查询=更多的时间

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

查询的哪一部分运行缓慢?首先,请尝试避免在循环中使用字符串连接—查看类似StringBuilder类的东西。不要在每次循环期间从数据库加载实体,构造一个查询,获取所有结果,然后迭代并创建html。
GetNaminationClientedAid
CheckNota
GetNumItem
…它们也会进入数据库吗?除此之外,
foreach
。还有什么()
查询数据库两次,外部的
for
会启动25次查询。尝试减少查询次数。我猜这部分代码已经查询了数据库150次。另外,
的范围为“08:30”
已损坏。对于与性能相关的查询,请在“确定”处发布代码。我将很快发布我的表及其字段……感谢您的技巧……等等,我很快就会发布它们。编译器在连接字符串时是否已经使用字符串生成器?@Caramiriel如果是这样,使用StringBuilder类将没有性能优势,但是如果您使用测试时,您会注意到性能存在巨大差异。此外,在我过去尝试使用“string”构建一个大字符串,但我得到了一个stackOverFlow异常,这在StringBuilder类中并不是那么简单。Grazie Fabio!谢谢Fabio!