在过去,我已经写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 - 不知道我是如何在第一时间错过了。只是在寻找错误的事情我想:)
低效相比,什么号码?在最后一行,我有两个选项,我可以看到,在执行查询和替代方法时计时,并查看哪个更快或查看IL,并根据您对表观执行速度的理解做出决定每条IL指令。在一天结束时,如果你编写了一个很差的查询,无论是在SQL还是Linq中,你的性能都会很差。 – Lazarus 2009-10-27 14:35:33
也许我没有举出一个好榜样,但我认为它的写作方式效率低下。我在谈论“大O”符号或渐近符号。除非你给它一个效率低下的对象树,否则按时间进行测试是很困难的,并且坦率地说IL很难阅读。我会在问题中澄清。 – Damovisa 2009-10-27 23:01:30