我正在使用.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秒,这仍然很慢)......
为什么?
答案 0 :(得分:4)
在您请求值之前,您在feuilleDeTemps
中存储的查询实际上并未执行。在您的情况下,当您致电First
时会发生这种情况。生成查询对象通常非常快。通常占用时间最多的是查询的执行。在您的示例中,您多次执行相同的查询,导致数次往返数据库。
使用LINQ记住查询与该查询的结果之间存在差异时,这一点很重要。通常,查询是懒惰地执行的 - 在您实际请求之前不会提取任何数据,例如使用First
,ToList
,foreach (var result in query)
等...
答案 1 :(得分:4)
您在第一个代码上触摸数据库四次。
第二个,触摸数据库一次,数据在该行之后可用。
这就是Entity Framwork如何滚动,男:D