计算这个查询的最好和最快的方法是什么?
本文关键字:方法 是什么 查询 计算 | 更新日期: 2023-09-27 18:10:43
我是c#和linq的初学者,用c#写这个查询:
var query1 = (from p in behzad.Customer_Care_Database_Analysis_Centers
select p).ToArray();
for (Int64 i = 0; i < query1.Count(); i++)
{
var query2 = (from tt in behzad.Customer_Care_Database_Analysis_DETAILs
where tt.fileid == FILE_ID && tt.code_markaz ==query1[i].code_markaz //"1215" //query1[i].code_markaz.ToString().Trim() //&& tt.code_markaz.ToString().Trim() == query1[i].code_markaz.ToString().Trim()
select new
{
tt.id
}).ToArray();
if (query2.Count() > 0)
{
series1.Points.Add(new SeriesPoint(query1[i].name_markaz, new double[] { query2.Count() }));
counter += 15;
}
}//end for
但是up代码非常慢,我有大约1000000 Customer_Care_Database_Analysis_Centers
和大约2000万条记录到Customer_Care_Database_Analysis_DETAILs
表中,这是最好的查询up代码吗?
您当前的代码首先将大量记录放入内存,然后为每个记录执行一个新的查询-尽管您再次获得所有内容,但您只使用项目计数。
我认为(未经测试),以下将执行得更好:
var query = from center in behzad.Customer_Care_Database_Analysis_Centers
join details in behzad.Customer_Care_Database_Analysis_DETAILs
on center.code_markaz equals details.code_markaz
where details.fileid == FILE_ID
where details.Any()
select new { Name = center.name_markaz, Count = details.Count()};
foreach(var point in query)
{
series1.Points.Add(new SeriesPoint(point.Name, new double[] { point.Count };
counter += 15;
}
- 不需要执行大量查询,只需执行一个查询,即可获得所需的数据
- 不是先将所有内容放入内存(使用ToArray()),而是在它到达时循环遍历它-这节省了大量内存