【问题标题】:View result of LINQ query in watch/debugger在监视/调试器中查看 LINQ 查询的结果
【发布时间】:2013-09-04 18:03:53
【问题描述】:

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

在一些测试代码中,我汇总了一些子项的一组指标的总数,并将总和与同一指标的父项值进行比较(深层嵌套 if-else)。我所有的查询都在 if 语句中。如何在不将结果分配给局部变量的情况下查看这些值?赋值使我的行数加倍,除了调试之外没有任何好处。有没有人可以在调试器中查看 LINQ 查询的结果?

【问题讨论】:

  • 也许您可以使用LINQPad 并引用您自己的程序集。你可以Dump查询,你会看到结果。
  • @AlexeiLevenkov 这些都是整数。
  • @Habib 我曾考虑在 LINQPad 中测试我的代码,但听起来工作量很大。在这一点上,最好的解决方案是关注价值观并做一些心算。
  • 有一些用于 LINQ to SQL 或 Linq to Entities 的调试可视化工具。对于 Lambda 表达式,您现在只能使用技巧:msdn.microsoft.com/en-us/library/vstudio/bb385795.aspx
  • @Habib 三年后更新:VS2015 现在支持在 Watch 窗口中编写 lambda 表达式,OzCode EAP (o.oz-code.com/LINQ_EAP) 现在允许您直接从调试器分析 LINQ 查询,无需在 LINQPad 中设置相同的引用。

标签: c# .net visual-studio-2010 linq


【解决方案1】:

您目前不能在 Visual Studio 的监视列表中使用 lambda 表达式。

你可以做几件事:

  1. 创建一个调用所需 lambda 的方法,然后放入该方法 调用你的 watch 语句。

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

我想这在 VS 的功能请求列表中,但 MSFT 还没有这样做。希望这在此期间有所帮助。

编辑:

好消息!您现在可以在 Visual Studio 2017 中评估 lambda。Huzzah!

【讨论】:

  • +1 虽然我已经知道这些变通方法,但都没有吸引力。
  • @evanmcdonnal 同意。我不喜欢更改代码以满足我的调试需求。
  • 那时我还不如在我知道如何使用调试器之前输入打印语句并进行调试:-&(
  • @evanmcdonnal nooo!不要回到黑暗的一面!
【解决方案2】:

我正在为那些还没有足够幸运使用 VS 2015 并且仍然遭受上一版本 VS 中缺少的功能的人挖掘这个旧线程。

为了调试而不得不拆分代码有点痛苦。

我喜欢用于 Where 查询的替代方法是:DynamicQueryable

假设您有一个查询:

myClass.Records.Where(rec => rec.Country.Code == "FRA")

然后使用 DynamicQueryable 您可以输入如下所示的监视语句:

System.Linq.Dynamic.DynamicQueryable.Where(myClass.Records.AsQueryable(), "Country.Code == \"FRA\"").ToList()

编写起来相当容易(同样适用于 Where 查询),并且由于这是一个监视语句,因此更新速度非常快,并且对于调试目的很有用。考虑始终添加 ToList() 或 ToArray() 以自动在 watch 语句中应用投影。

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

我还建议使用名为OzCode 的工具。最新版本包含LINQ debug feature which is quite awesome。您可以在 LINQ 语句的每个级别跟踪正在修改的集合的状态。

【讨论】:

    【解决方案3】:

    In Visual Studio 2015 you'll be able to debug lambda expressions(在撰写本文时是 Preview)。您将能够使用 lambda 表达式等添加手表。

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

    【讨论】:

    • 这太棒了!我已经使用 VS 2015 大约 4 个月了,从使用旧版本的 VS 开始,我一直认为监视窗口中不允许使用 LINQ 查询。
    【解决方案4】:

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

    在其中,我可以进一步扩展并查看其中的数据:

    【讨论】:

    • 你赋值给了一个局部变量。我的代码实际上看起来像这样if (parent.Invites == children.Select(x => x.Invites).Aggregate((c, n) => c + n))。我一直在寻找一种方法来避免在任何地方添加不必要的赋值,这样我就可以在调试器中查看该查询的返回值。
    • 啊,但是我的断点是在分配局部变量之前。我从来没有到达过那个部分,断点在哪里。
    • 噢!无视我说的话。我没有考虑将结果分配给局部变量“查询”。双嗬!对不起,伙计!
    • 我认为你错了。您的图像显示您在第 16 行中断,分配发生在第 14 行。
    • 嘿,是的,你说的很对。我忘记了本地“查询”变量。我显然没有在想……显然。
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多