调试LINQ查询

GWL*_*osa 17 c# linq debugging

我们最近在LINQ上做了很多工作,主要是在LINQ-to-Objects意义上.不幸的是,我们的一些查询可能有点复杂,特别是当它们开始涉及组合的多个序列时.当你得到的问题看起来很像时,很难确切知道发生了什么:

IEnumerable<LongType> myCompanies =       relevantBusiness.Children_Companies
            .Select(ca => ca.PR_ContractItemId)
            .Distinct()
            .Select(id => new ContractedItem(id))
            .Select(ci => ci.PR_ContractPcrId)
            .Distinct()
            .Select(id => new ContractedProdCompReg(id))
            .Select(cpcr => cpcr.PR_CompanyId)
            .Distinct();

var currentNewItems = myCompanies 
                .Where(currentCompanyId => !currentLic.Children_Appointments.Select(app => app.PR_CompanyId).Any(item => item == currentCompanyId))
                .Select(currentId => new AppointmentStub(currentLic, currentId))
                .Where(currentStub=>!existingItems.Any(existing=>existing.IsMatch(currentStub)));


Items = existingItems.Union(newItems).ToList();
Run Code Online (Sandbox Code Playgroud)

等等......

即使您进行调试,也很难分辨谁在做什么,何时做什么.如果没有无偿地在序列上调用"ToList"来获取我可以更容易检查的东西,那么有没有人对如何调试"复杂"LINQ有任何好的建议?

mqp*_*mqp 15

像这样的查询似乎向我表明,你在选择合适的数据结构方面做得不好,或者在封装和分离任务方面做得很好.我建议看一看并分解它.

但是,一般情况下,如果我想调试一个明显不正确的LINQ查询,我会将其分解为子查询并在调试器中一次一个地检查结果.


Cri*_*scu 14

我知道我的回答"有点"晚了,但我不得不分享这个:

刚刚发现了LinqPad,它令人惊叹(更不用说免费)了.
无法相信我在不知道这个工具的情况下写了很长时间.

据我所知,这是O'Reilly的"C#3.0 in a Nutshell""C#4.0 in a Nutshell"的作者(s?)的作品.


Mic*_*ens 8

当我最近环顾​​四周寻找同一个问题的答案时,我发现了一些有趣的提示,但是没有一个有凝聚力的叙事真的在回答这个问题.所以我自己写了一篇,它刚刚发布在Simple-Talk.com上(LINQ Secrets Revealed:Chaining and Debugging).您可能需要注册才能阅读该文章(网站似乎在最近几天进行了一些更改)所以以下是本文的重点:

(1)在LINQPad中:使用其非凡的Dump()方法.您可以在LINQ链中的一个或多个点注入此内容,以便以清晰,清晰的方式查看您的数据.

(2)在Visual Studio中:在LINQ链的中间嵌入nop语句,以便设置断点.请注意,return语句必须在其自己的行上才能在Visual Studio中设置断点.(感谢Eric White的博客文章Debugging LINQ Queries for this tip.)

.Select(z =>
{return z;}
)
Run Code Online (Sandbox Code Playgroud)

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

(4)最后,(是的,我迷恋于LINQPad的Dump方法!)将LINQPad的可视化功能直接带入了带有Robert Ivanc的LINQPad Visualizer插件的Visual Studio 中.不是一个完美的解决方案(VS2010还没有支持,要求类可序列化,一些渲染问题)但它非常有用.

2016.12.01更新

刚刚发布在Simple-Talk.com上的是上一篇文章的续篇:LINQ调试和可视化.本文全面介绍了Visual Studio 2015的OzCode扩展的新LINQ调试功能.OzCode最终使LINQ调试变得简单而强大.(而且,不,我为OzCode工作:-).