2012-09-20 33 views
2

我们有一个系统,可以处理各种复杂而简单的select查询。LINQ First vs查找性能考虑因素

我们做了一些简单的测试,并得到这些结果:

Query 3.9 seconds : 
var result = (from temp in context.model 
       where temp.ID == 1302 
       select temp).First(); 

Start Transaction time: 17:54:58.7073806 
End Transaction time: 17:55:02.6246046 

Query 3.7 seconds : 
Model modelResult = context.Model.Find(1302); 

Start Transaction time: 17:53:51.1995194 
End Transaction time: 17:53:54.8737295 

我一直在读试图找出什么是最好的选项。在这个网站上有很多关于这个话题的讨论,但是,我还没有找到我需要的东西。我知道查询选择是基于情景的(基于查询的复杂性等),但是当我们需要基于一个不会再次使用的键的单个实体时(这意味着,在Find ,缓存并不重要,因为该查询不太可能再次被调用)使用直接LINQ还是继续使用Find更好?

缓存查找结果的成本是什么时候不会使用,成本太高?我们的简单测试结果是否足够准确,以便在单个实体/关键情况下,Find始终会更快?

我没有测试LINQ关闭跟踪,这是比给出的两个例子更好的方法吗?

回答

5

这两者并不完全一样。

Find将检查实体是否已经在上下文中加载。如果有,它将仅返回它而不执行查询。在这种情况下,它可能会更有效率。

但是,如果实体不在上下文中,它将执行更类似于SingleOrDefault的查询,而不是第一次,这将需要从服务器拉回前两个结果。虽然在构建查询时没有任何开销,但查询本身可能会(稍微)慢一些,并且结果会有所不同,因为如果有多个匹配项,您将收到错误。

有关更多详细信息和信息,包括生成的查询,请参阅此Slauma's answer here

+0

伟大的答案谢谢,这和Slauma的答案链接正是我一直在寻找。 – northpole