我们有一个系统可以执行各种复杂而简单的选择查询。
我们做了一些简单的测试并得到了这些结果:
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更好吗?
缓存查找结果的成本,当它不会被使用时,成本太高了吗?我们的简单测试结果是否足够准确,假设在单个实体/密钥情况下查找总是更快?
我没有通过关闭跟踪来测试LINQ,这会比给出的两个例子更好吗?
答案 0 :(得分:5)
两者并不完全相同。
Find
将检查实体是否已在上下文中加载。如果有,它将返回它而不执行查询。在这种情况下,它可能会更有效率。
但是,如果实体不在上下文中,它会执行更像SingleOrDefault
而不是第一个的查询,这将需要从服务器中取回前两个结果。虽然构造查询没有任何开销,但查询本身可能会(非常轻微)因此而变慢,并且结果会有所不同,因为如果存在多个匹配项,您将收到错误。
有关详细信息和信息,包括生成的查询,请参阅此Slauma's answer here。