当前位置:  开发笔记 > 开发工具 > 正文

如何调试LINQ语句

如何解决《如何调试LINQ语句》经验,为你挑选了6个好方法。

我有一个Linq to objects语句

 var confirm = from l in lines.Lines 
 where (l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber) 
 select l;

confirm对象在System.Linq.Enumerable.WhereListIterator`1.MoveNext()返回'Object Null或Not A Reference'.

如果查询结果为空,则只返回一个空的枚举器.我知道声明中没有空对象.是否可以单步执行LINQ语句以查看它在哪里崩溃?

编辑当我说我知道一个事实,即没有空物体时,事实证明我在撒谎:[,但问题仍然存在,虽然我觉得答案是"你不能真的"

LINQPad是一个好主意,我用它来自学LINQ,但我可能会再次将它看作调试/斜杠和刻录样式工具



1> 小智..:

是的,确实可以在linq查询中途暂停执行.

使用lambda表达式将linq转换为查询样式,并插入一个Select语句,该语句在linq中要调试的点之后的某处返回.一些示例代码将使其更清晰 -

        var query = dataset.Tables[0].AsEnumerable()
            .Where (i=> i.Field("Project").Contains("070932.01"))
 //         .Select(i =>
 //         {return i;}
 //           )
            .Select (i=>i.Field("City"));

然后取消注释注释行.确保{return i;}在它自己的行上并在那里插入一个调试点.您可以在长而复杂的linq查询中的任何位置放置此选择.



2> OwenP..:

我不确定是否可以从VS调试,但我发现LINQPad非常有用.它将允许您转储LINQ查询的每个部分的结果.


就像枕头的另一面.

3> Steve Steine..:

您应该能够在whereLINQ语句的子句中的表达式上设置断点.

在此示例中,将光标放在以下代码段中的任何位置:

(l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber)

然后按F9或使用菜单或上下文菜单添加断点.

如果设置正确,只有上面的代码应该在编辑器中具有断点格式,而不是整个LINQ语句.您还可以在断点窗口中查看.

如果您已正确设置,则每次都会在实现上述部分查询的函数处停止.



4> Michael Sore..:

我写了一篇全面的文章,回顾2010年在Simple-Talk.com上发布的这个问题(LINQ Secrets Revealed:Chaining and Debugging):

我谈到LINQPad(如前面OwenP所述)作为Visual Studio 外部的一个很棒的工具.特别注意其非凡的Dump()方法.您可以在LINQ链中的一个或多个点注入它,以便以非常干净和清晰的方式查看您的数据.虽然非常有用,但LINQPad是Visual Studio的外部.所以,我可以使用也存在多种技术的Visual Studio,因为有时它是不符合实际需要的代码块到LINQPad迁移:

(1)注入我在文章中提到的Dump()扩展方法的调用以允许记录.我开始使用Bart De Smet的Watch()方法,在他的信息文章LINQ to Objects - Debugging中添加了一些标签和颜色以增强可视化,但与LINQPad的Dump输出相比仍然相形见绌.

(2)使用Robert Ivanc的LINQPad Visualizer插件将LINQPad的可视化直接带入Visual Studio .不确定是不是通过我的刺激:-),但是当我写文章时,这对夫妇的不便现在在最新版本中得到了令人钦佩的解决.它具有完整的VS2010支持,可让您在调试时检查您喜欢的任何对象.

(3)在LINQ链的中间嵌入nop语句,以便设置断点,如前面的Amazing Pete所述.

2016.12.01更新

我刚刚写了上一篇文章的续集,标题为简单的LINQ调试和可视化,它揭示了真正的LINQ调试功能终于在Visual Studio 2015中与OzCode中即将发布的新功能相结合.@Dror对这个问题的回答显示了它的一个小小的一瞥,但我鼓励你阅读我的新文章,深入探讨"如何".(而且我为OzCode工作.:-)



5> Dror Helper..:

[免责声明:我在OzCode工作]

LINQ的问题在于它很难调试 - 即使在处理简单查询时,开发人员也不得不将他/她的查询重构为一堆foreach循环,或者使用日志记录.即将发布的OzCode版本(目前作为早期访问预览版提供)支持LINQ调试,它还可以帮助开发人员深入了解他们的LINQ代码,并查明难以捕获查询中的异常的内容

这是您的查询在OzCode中的样子:调试LINQ异常



6> user14142135..:

可以在不设置任何临时断点的情况下进入LINQ表达式.您需要进入评估 LINQ表达式的函数,例如:

var confirm = from l in lines.Lines 
              where (l.LineNumber == startline.LineNumber)
                    || (l.LineNumber == endline.LineNumber) 
              select l;

 confirm.ToArray(); // Press F11 ("Step into") when you reach this statement

 foreach(var o in q) // Press F11 when "in" keyword is highlighted as "next statement"
    // ...

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有