为什么var.First()会导致性能问题?

时间:2011-10-18 18:01:35

标签: c# entity-framework .net-4.0

我正在使用.NET 4.0 c#。 我刚才意识到性能问题部分是由于这个原因导致的:

var feuilleDeTemps =
    from fdt in context.FeuilleDeTemps.Include("FeuilleDeTempsJournees");
...
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
feuilleDeTemps.First().Property
...
FeuilleDeTemps myFT = feuilleDeTemps.First();
return myFT;

我正在使用feuilleDeTemps的第一个元素(每个循环大约4次x 60个循环),然后将它设置为这样的普通变量:

FeuilleDeTemps myFT = feuilleDeTemps.First();

然后我意识到这会导致性能问题。我改用了这个:

var feuilleDeTemps =
    from fdt in context.FeuilleDeTemps.Include("FeuilleDeTempsJournees");
FeuilleDeTemps myFT = feuilleDeTemps.First();
...
myFT.Property
myFT.Property
myFT.Property
myFT.Property
...
return myFT;

我使用的是feuilleDeTemps.First()。属性约240次。 现在我使用它60次,属性的240次使用直接由Typed变量。 它使我的代码执行时间减少了2倍(3秒对6秒,这仍然很慢)......

为什么?

2 个答案:

答案 0 :(得分:4)

在您请求值之前,您在feuilleDeTemps中存储的查询实际上并未执行。在您的情况下,当您致电First时会发生这种情况。生成查询对象通常非常快。通常占用时间最多的是查询的执行。在您的示例中,您多次执行相同的查询,导致数次往返数据库。

使用LINQ记住查询与该查询的结果之间存在差异时,这一点很重要。通常,查询是懒惰地执行的 - 在您实际请求之前不会提取任何数据,例如使用FirstToListforeach (var result in query)等...

答案 1 :(得分:4)

您在第一个代码上触摸数据库四次

第二个,触摸数据库一次,数据在该行之后可用。

这就是Entity Framwork如何滚动,男:D