2

我们有一个系统可以执行各种复杂和简单的选择查询。

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

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 结果的成本,当它不会被使用时,成本是否太高?我们简单测试的结果是否足够准确,可以假设 Find 在单个实体/键的情况下总是更快?

我没有通过关闭跟踪来测试 LINQ,这会比给出的两个示例更好吗?

4

1 回答 1

5

两者并不完全相同。

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

但是,如果实体不在上下文中,它会执行查询,SingleOrDefault而不是首先执行查询,这将需要从服务器拉回前两个结果。虽然构造查询没有开销,但查询本身可能会(非常轻微)因此而变慢,并且结果会有所不同,因为如果有多个匹配项,您将收到错误。

有关更多详细信息和信息,包括生成的查询,请在此处查看此 Slauma 的答案

于 2012-09-20T17:14:50.683 回答