我有一个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,但我可能会再次将它看作调试/斜杠和刻录样式工具
是的,确实可以在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查询中的任何位置放置此选择.
我不确定是否可以从VS调试,但我发现LINQPad非常有用.它将允许您转储LINQ查询的每个部分的结果.
您应该能够在where
LINQ语句的子句中的表达式上设置断点.
在此示例中,将光标放在以下代码段中的任何位置:
(l.LineNumber == startline.LineNumber) || (l.LineNumber == endline.LineNumber)
然后按F9或使用菜单或上下文菜单添加断点.
如果设置正确,只有上面的代码应该在编辑器中具有断点格式,而不是整个LINQ语句.您还可以在断点窗口中查看.
如果您已正确设置,则每次都会在实现上述部分查询的函数处停止.
我写了一篇全面的文章,回顾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工作.:-)
[免责声明:我在OzCode工作]
LINQ的问题在于它很难调试 - 即使在处理简单查询时,开发人员也不得不将他/她的查询重构为一堆foreach循环,或者使用日志记录.即将发布的OzCode版本(目前作为早期访问预览版提供)支持LINQ调试,它还可以帮助开发人员深入了解他们的LINQ代码,并查明难以捕获查询中的异常的内容
这是您的查询在OzCode中的样子:
可以在不设置任何临时断点的情况下进入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" // ...