计算此查询的最佳和快速方法是什么?

时间:2015-09-01 07:40:12

标签: c# linq

我是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


但代码很慢,我有大约1000000 Customer_Care_Database_Analysis_Centers和大约2000万条记录到Customer_Care_Database_Analysis_DETAILs表,这是最好的查询代码?谢谢。

1 个答案:

答案 0 :(得分:1)

您当前的代码首先会在内存中获取大量记录,然后为每条记录执行一个新查询 - 您只使用项目数,即使您再次获得所有内容。

我认为(未经测试)以下内容会更好:

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()),而是在它到达时循环访问 - 这样可以节省大量内存