我怎样才能加快这个查询 linq?
How can i speed this query linq please?
我想使此方法中的 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 个建议来让这个方法执行得更快:
1) 不要使用 'string codice = String.Empty;',而是使用 StringBuilder,如下所示:'StringBuilder longString = new StringBuilder();'
您可能需要将 System.Text 添加到代码文件顶部的 using 引用中。 StringBuilder 比使用普通字符串快得多,原因有很多,您可以在此处阅读:
String vs. StringBuilder
2) 与其使用 2 个字符串数组然后每次都解析这些字符串,不如循环到 Timespan 对象中,而应该创建 2 个 TIMESPANS 数组。目前,您正在将字符串转换为时间跨度 2 次(2 数组)* 25 次(您的循环),因此,这些是您不需要执行的 50 次转换。
这是您可以略微优化代码的方法。
然后,要优化数据库访问,您应该只对所有结果执行 1 个查询,然后构建 html 通过代码拆分结果。
更多查询 = 更多时间
除了 3dd 的观点之外,这个查询的速度几乎与您的 C# 代码无关,而与数据库有关。
如果 Eventi 和 DataPrenotazione 都很大并且索引不正确,那么查询将 运行 变慢。最好在 SQL 中进行探索,并使用数据库提供的任何工具进行分析以了解查询性能。
我想使此方法中的 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 个建议来让这个方法执行得更快:
1) 不要使用 'string codice = String.Empty;',而是使用 StringBuilder,如下所示:'StringBuilder longString = new StringBuilder();' 您可能需要将 System.Text 添加到代码文件顶部的 using 引用中。 StringBuilder 比使用普通字符串快得多,原因有很多,您可以在此处阅读: String vs. StringBuilder
2) 与其使用 2 个字符串数组然后每次都解析这些字符串,不如循环到 Timespan 对象中,而应该创建 2 个 TIMESPANS 数组。目前,您正在将字符串转换为时间跨度 2 次(2 数组)* 25 次(您的循环),因此,这些是您不需要执行的 50 次转换。
这是您可以略微优化代码的方法。
然后,要优化数据库访问,您应该只对所有结果执行 1 个查询,然后构建 html 通过代码拆分结果。 更多查询 = 更多时间
除了 3dd 的观点之外,这个查询的速度几乎与您的 C# 代码无关,而与数据库有关。 如果 Eventi 和 DataPrenotazione 都很大并且索引不正确,那么查询将 运行 变慢。最好在 SQL 中进行探索,并使用数据库提供的任何工具进行分析以了解查询性能。