计算这个查询的最好和最快的方法是什么?

本文关键字:方法 是什么 查询 计算 | 更新日期: 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()),而是在它到达时循环遍历它-这节省了大量内存

计算这个查询的最好和最快的方法是什么?