EF LINQ连接会降低性能

时间:2015-04-18 21:24:47

标签: c# performance linq entity-framework

非常欢迎任何有关此问题的线索。

我使用EF4并需要循环大量记录,因此性能是首要任务。

因此我将查找表放在静态内存(List(表实体))中以便更快地访问。

但是我发现如果我使用了一个连接的Linq表达式来填充我的静态List,那么调用静态数据的速度要慢于我刚刚在List中输入未经过滤的整个表。

请考虑以下示例:

private static List<MMoptions> _testJOINED;
private static List<MMoptions> _testALONE;

protected  void Button1_Click(object sender, EventArgs e)
{   
  _testJOINED = new List<MMoptions>(); 
  _testALONE = new List<MMoptions>();

    using (var context = new LBEntities())
    {                

    _testJOINED = (from opt in context.MMoptions
                     join ctr in context.MMcontrols on opt.opControlID equals ctr.ctrID
                     join mod in context.MMmodel on ctr.ctrModelID equals mod.mID
                     where mod.mActive == true
                     select opt).ToList();

    _testALONE = context.MMoptions.ToList();
}

Stopwatch st = new Stopwatch();

st.Restart();

for (int i = 0; i < 10000; i++)
  {
    var opt = _testALONE.Where(f => f.opParent == "RANGE_BU" && f.opSelectValue == "RANGE4").FirstOrDefault();
  }

st.Stop();   
Response.Write("testALONE:" + st.ElapsedMilliseconds.ToString());

st.Restart();

for (int i = 0; i < 10000; i++)
   {
     var opt = _testJOINED.Where(f => f.opParent == "RANGE_BU" && f.opSelectValue == "RANGE4").FirstOrDefault();
   }

 st.Stop();
 Response.Write("testJOINED:" + st.ElapsedMilliseconds.ToString());


}

testJoined(10000records)在1400ms执行

testAlone(17000记录)执行时间为6ms

我不明白,在som点上,加入的数据是否作为自重继承到我的列表中?

此致

标记

更新。

我注意到如果省略第二次连接(对MMmodel),性能是相同的。 EF模型显示3个表之间的正确关系。

1 个答案:

答案 0 :(得分:0)

差异是由于只有在调用_testJOINED函数时才会填充_testJOINED.Where这一事实。这称为延期执行,您可以在同一标题下的MSDN上找到有关此内容的更多详细信息。 您应该分别测量两个集合的数量,并且您会看到_testJOINED会立即填充,而_testALONE需要一些时间。