C# 在监视/调试器中查看LINQ查询的结果

C# 在监视/调试器中查看LINQ查询的结果,c#,.net,visual-studio-2010,linq,C#,.net,Visual Studio 2010,Linq,有没有一种方法可以在VisualStudio2010中查看LINQ查询的结果?如果将查询添加为监视表达式,它将显示“表达式不能包含lambda表达式” 在一些测试代码中,我聚集了一些子级的一组度量的总和,并将总和与相同度量的父级值进行比较(如果有,则进行深嵌套)。我所有的查询都在if语句中。如何查看这些值而不只是将结果赋给局部变量?分配使我的行数加倍,除了调试之外,这里没有任何好处。是否有人有在调试器中查看LINQ查询结果的变通方法?您当前无法在Visual Studio的监视列表中使用lamb

有没有一种方法可以在VisualStudio2010中查看LINQ查询的结果?如果将查询添加为监视表达式,它将显示“表达式不能包含lambda表达式”


在一些测试代码中,我聚集了一些子级的一组度量的总和,并将总和与相同度量的父级值进行比较(如果有,则进行深嵌套)。我所有的查询都在if语句中。如何查看这些值而不只是将结果赋给局部变量?分配使我的行数加倍,除了调试之外,这里没有任何好处。是否有人有在调试器中查看LINQ查询结果的变通方法?

您当前无法在Visual Studio的监视列表中使用lambda表达式

您可以做以下几件事:

  • 创建一个调用所需lambda的方法,然后放入该方法 打电话给你的值班报表

  • 将所需的lambda表达式设置为变量,然后查看 该变量的内容。请注意,这将枚举 通过表达,并可能引起副作用

  • 我可以想象这是在VS的功能请求列表中,但MSFT还没有这样做。希望这同时能有所帮助

    编辑:


    好消息!现在,您可以在Visual Studio 2017中评估lambdas。胡萨

    我不确定这是否是您的意思(我可能误解了),但我可以通过查看“局部变量”窗口并展开查询变量的“结果”视图来查看LINQ查询的结果。

    在此范围内,我可以进一步展开并查看其中的数据: (这是在撰写本文时的预览)。您可以添加带有lambda表达式等的手表


    表达式计算器必须重写,因此缺少许多功能:远程调试ASP.NET、在即时窗口中声明变量、检查动态变量等。此外,目前不支持需要调用本机函数的lambda表达式。当VS2015发布时,所有功能都将完成。

    我正在为那些还没有幸运地使用VS 2015的用户挖掘这条旧线索,而这些用户在以前版本的VS中仍然缺少这一功能

    仅仅为了调试而拆分代码有点痛苦

    我喜欢在查询中使用的另一种方法是:DynamicQueryable

    假设您有一个查询:

    myClass.Records.Where(rec => rec.Country.Code == "FRA")
    
    然后,使用DynamicQueryable,您可以输入如下所示的watch语句:

    System.Linq.Dynamic.DynamicQueryable.Where(myClass.Records.AsQueryable(), "Country.Code == \"FRA\"").ToList()
    
    它非常容易编写(同样适用于Where查询),因为这是一个watch语句,更新速度非常快,对于调试非常有用。考虑始终添加ToList()或ToArray()以自动在watch语句中应用投影

    对于复杂的Select语句,我想它不会那么方便,但可能仍然有帮助


    我还建议使用名为的工具。最后一个版本包含。您可以在LINQ语句的每个级别跟踪正在修改的集合的状态。

    +1尽管我已经知道这些工作,而且两者都没有吸引力。@evanmcdonnal同意。我不喜欢更改代码以满足调试需要。在这一点上,我可能只需要输入打印语句并进行调试,就像我在知道如何使用调试器之前所做的那样:-&(@evanmcdonnal nooo!不要回到黑暗面!也许你可以使用和引用你自己的程序集。你可以
    转储
    查询,然后你就会看到结果。@AlexeiLevenkov这些都是整数。@Habib我曾考虑过在LINQPad中测试我的代码,但这听起来像是一个地狱般的工作。在这一点上,最好的解决方案是眼珠调整值并做一点心算。对于LINQ to SQL或LINQ to Entities,有一些调试可视化工具。对于Lambda表达式,您现在只能使用技巧:@Habib 3年后的更新:VS2015现在支持在监视窗口中写入Lambda表达式,以及OzCode EAP()现在允许您直接从调试器分析LINQ查询,无需在LINQPad中设置相同的引用。您分配给了一个局部变量。我的代码实际上类似于if(parent.invests==children.Select(x=>x.invests).Aggregate((c,n)=>c+n))
    。我一直在寻找一种方法,以避免在任何地方添加不必要的赋值,这样我就可以在调试器中查看该查询的返回值。啊,但我的断点在分配局部变量之前。我从未到达该部分,断点就在那里。啊!不管我说了什么。我没有想到结果会很糟糕注册到局部变量“query”。Double-doh!抱歉,伙计!我认为你错了。你的图像显示你在第16行中断,赋值发生在第14行。嘿,是的,你说得很对。我忘记了局部“query”变量。我显然没有思考…显然。这太棒了!我已经使用VS 2015大约4个月了,由于使用了旧版本的VS,我一直认为LINQ查询不允许出现在监视窗口中。