很多都可以写回应这个看似简单的问题!事实上,我已经在Simple-Talk.com上的文章LINQ Secrets Revealed: Chaining and Debugging中详细写过。下面是它的要点总结:
- 您可以进入与调试一些LINQ查询,但在查询依赖于表达式和语句的组成(因为你只能跨上声明) 。
- LINQ方法链由于基本规则而起作用:每个非终端方法以
IEnumerable<T>
作为输入并返回IEnumerable<T>
作为输出。
- 如果您愿意,只要符合该基本规则,您可以注入一个“禁止使用”声明来给您一个“垫脚石”。也就是说,意识到你总是可以将
.Select(z => z)
放在方法链中,而不会产生任何后果,请使用其中的变体:z => { return z; }
。
- 您可以类似地注入一种诊断方法来提供输出,而不仅仅提供一个潜在的断点。 LINQPad,不仅仅是LINQ,而是一般的C#的优秀暂存器,它以其强大的
Dump()
方法的幌子提供了这一点。转储是一种对象可视化工具,可提供令人惊叹的复杂数据结构可视化。
- 根据Bart De Smet在其内容丰富的文章LINQ to Objects – Debugging中的工作,您可以将
Dump
的简化版带回到Visual Studio中 - 我提供的代码附在顶部提到的文章中。
- 感谢Robert Ivanc在LINQPad Visualizer上的工作,您甚至可以将LINQPad可视化工具带入Visual Studio(尽管您需要手动为单个表达式启动它;您无法将其挂接到
Dump()
方法)。
作为一个简单的例子,考虑这个简单的方法链:
string[] Words = new string[]
{" KOOKABURRA", "Frogmouth", "kingfisher ", "loon", "merganser"};
Words
.Select(word => word.Trim())
.Select(word => word.ToLower())
.Where(word => word.StartsWith("k"))
.OrderBy(word => word);
一旦你包括转储扩展方法在Visual Studio项目,您可以微创仪器像这样...
Words
.Select(word => word.Trim())
.Dump()
.Select(word => word.ToLower())
.Dump()
.Where(word => word.StartsWith("k"))
.Dump()
.OrderBy(word => word)
.Dump();
...或更多精心这样的...
Words
.Dump(w => "ORIGINAL: " + w, ConsoleColor.Yellow)
.Select(word => word.Trim())
.Dump(w => "TRIMMED: " + w, ConsoleColor.Yellow)
.Select(word => word.ToLower())
.Dump(w => "LOWERCASE: " + w, ConsoleColor.Green)
.Where(word => word.StartsWith("k"))
.Dump(w => "FILTERED to 'K': " + w, ConsoleColor.Red)
.OrderBy(word => word)
.Dump(w => "SORTED: " + w, ConsoleColor.Blue);
...得到的输出呈现为无论是左侧或图的右侧,分别为:
作为一个传情,我会说虽然这确实很有用,但您确实必须看到LINQPad可以使用相同的输出(here再次为您提供方便)所做的增强可视化。
为什么不把它分解成小块,并写每个单元的单元测试?然后写一个整体的单元测试? – 2012-07-11 20:31:56
请看这篇文章 http://stackoverflow.com/questions/118341/how-to-debug-a-linq-statement – james31rock 2012-07-11 20:33:18
调试LINQ结果的一部分困难是它将默认为IEnumerable并被评估懒惰,所以传统的VS IDE调试工具只会帮助你。我推荐LINQPad,如果你想在LINQ中涂鸦和玩结果。 –
2012-07-11 20:37:32