2009-10-27 22 views
2

在过去,我已经写Linq到SQL执行不好的查询。使用SQL事件探查器(或类似的),我可以通过在数据库拦截它来查看我的查询是如何转换为SQL的。有没有办法分析一个特定的Linq对象查询如何执行?

有没有办法做到这一点与Linq查询完全对对象进行操作?

作为一个例子,考虑有向图的边缘的列表在以下的LINQ查询:

var outEdges = from e in Edges 
       where e.StartNode.Equals(currentNode) && 
       !(from d in deadEdges select d.StartNode).Contains(e.EndNode) 
       select e; 

即代码应该选择从当前节点开始除了那些能所有边缘导致死路一条。

现在,我怀疑这个代码是低效的,但我不知道如何证明它除了分析生成的MSIL。我宁愿不这样做。

有没有人知道我可以做到这一点没有SQL?

编辑:

当我谈到效率低下,我的意思是“大O”符号或渐近记法的条款无效。在上面的例子中,是在O(n)还是O(n log m)甚至O(n.m)中执行Linq的代码?换句话说,执行路径的复杂性是什么?

使用Linq to SQL,我可能会看到(例如)第二个where子句被翻译为针对每个边缘运行的子查询,而不是更有效的连接。在这种情况下,我可能会决定不使用Linq,或者至少更改Linq,以便在大型数据集上更高效。

编辑2:

Found this post - 不知道我是如何在第一时间错过了。只是在寻找错误的事情我想:)

+0

低效相比,什么号码?在最后一行,我有两个选项,我可以看到,在执行查询和替代方法时计时,并查看哪个更快或查看IL,并根据您对表观执行速度的理解做出决定每条IL指令。在一天结束时,如果你编写了一个很差的查询,无论是在SQL还是Linq中,你的性能都会很差。 – Lazarus 2009-10-27 14:35:33

+0

也许我没有举出一个好榜样,但我认为它的写作方式效率低下。我在谈论“大O”符号或渐近符号。除非你给它一个效率低下的对象树,否则按时间进行测试是很困难的,并且坦率地说IL很难阅读。我会在问题中澄清。 – Damovisa 2009-10-27 23:01:30

回答

1

我不认为你需要一个分析器...

LINQ到SQL(或LINQ到实体)查询翻译成另一种语言(SQL)然后使用优化的执行计划执行,因此很难看到究竟发生了什么;对于这种情况,分析器可能会有所帮助。另一方面,Linq to Objects查询不会被翻译,它们是按“原样”执行的。使用类似SQL的语法的Linq to Objects查询只是一系列方法调用的语法糖。在你的情况下,查询的完整形式是:

var outEdges = Edges.Where(e => e.StartNode.Equals(currentNode) && 
          !deadEdges.Select(d => d.StartNode).Contains(e.EndNode)); 

所以,基本上,你遍历Edges,并为Edges每个项目你迭代deadEdges。所以,这里的复杂性是O(n.m),其中n是项目的Edges数量,以及m项目的deadEdges

+0

谢谢你,我想我明白了一点。 那么这是什么意思,如果有一个快捷方式(比如从deadEdges预填充开始节点的哈希列表),我可能必须手动执行它? – Damovisa 2009-10-28 23:15:43

+0

对不起,我不明白你的问题... – 2009-10-29 13:06:31

+0

没问题 - 我的意思是如果有一个更有效的方法来做到这一点,我不得不手动编写而不是使用Linq – Damovisa 2009-11-20 06:52:23

相关问题