【问题标题】:How to debug a Linq Lambda Expression?如何调试 Linq Lambda 表达式?
【发布时间】:2013-06-18 08:10:23
【问题描述】:

我正在使用实体框架和 Linq to Entitites。

我想知道 Visual Studio 2012 中是否有任何方法可以逐步调试此代码。 在放置断点的那一刻,光标越过它但没有进入。

我更感兴趣的是查看 x.e... 的值...而不是生成的 sql 例如。

注意:我可以使用其他工具或 Visual Studio 插件。

          IEnumerable<EventPushNotification> eventToPushCollage = eventsForEvaluation
                    .GroupJoin(eventCustomRepository.FindAllPushedEvents(),
                        e => e.Id,
                        p => p.PushedEventId,
                        (e, p) => new { e, p })
                     .Where(x => x.e.DateTimeStart > currentDateTime &&
                        currentDateTime >= x.e.DateTimeStart.AddMinutes(defaultReminders) &&     //  Data from default reminder for collage event in web.config  
                        x.p.Count() == 0)                                           // Check if the Event has not being already pushed
                     .Select(y => new EventPushNotification
                     {
                         Id = y.e.Id,
                         EventTitle = y.e.EventTitle,
                         DateTimeStart = y.e.DateTimeStart,
                         DateTimeEnd = y.e.DateTimeEnd,
                         Location = y.e.Location,
                         Description = y.e.Description,
                         DeviceToken = y.e.DeviceToken
                     });

【问题讨论】:

标签: c# linq entity-framework debugging lambda


【解决方案1】:

请务必阅读有关此问题的官方 MSDN 文档:

Debugging LINQ

请在 Visual Studio 的用户语音页面上为这个建议投票:

Debug Lambda expressions

Allon Guralnekcmets 于 2014 年 3 月 18 日 12:37 PM 关于仅使用键盘设置断点的方法:

@Anonymous:您今天可以通过在 lambda,从而使您能够检查传入的每个值并 出lambda。据我所知,你不能在里面设置断点 一个 lambda 使用鼠标,你必须使用键盘。放置光标 在 lambda 主体内(例如,在第一个标记上,或在 => 和后面的空格)然后按 F9(或您用来放置断点的任何键盘快捷键)。只有内部 lambda 语句将变为红色,调试器将在那里中断 对于每个项目的 lambda 进行评估(所以对于 100 的数组 项,使用 .Where() 将导致断点命中 100 次)。

这是我当前的 Visual Studio 2013 中的实际应用:

如您所见,它运行良好,让我们可以看到正在测试的给定属性的值。这肯定是一个很棒的工具/救生员! :)

【讨论】:

  • 酷,您的提示只是帮助我调试各种 lambda 表达式,这对我来说是一个完全黑匣子。谢谢
  • 这在编辑器(VS2013)中看起来不错(只有 lambda 是红色的),但是当启动调试时,整个语句对我来说变成红色并且调试器在外部语句上中断。 :( 想法?
  • 这不是答案吗?
  • 我在 2022 年,但我无法做到这一点。为什么??????
【解决方案2】:

如果您使用的是 Linq to Entities 提供程序,则 can't 调试 Lambda 表达式。

但您可以take a look 将其转换为 SQL。 另外,如果您愿意遭受性能损失-您可以将其全部加载到 Linq 中以进行对象-并执行Step by step

【讨论】:

  • 我不会投反对票,但请查看下面的 stackoverflow.com/a/22518808/2754848 并找到一个效果很好的解决方案。
  • @Daved hmmm Leniel 是对的 if OP 使用的是 LinqToObjects - 但这不是 OP 的情况。 OP 的 lambda 是 LinqToEntities - 并且一个 cant 像 Leiel 建议的那样调试那些。我已经更新了我的答案
  • 很公平。我读了那部分。也感谢您编辑您的解决方案。 Linq to Obj 看下面。 Linq to Entity 看上面:)
  • @JensKloster 请注意,该声明不再正确 - 我正在开发一个名为 OzCode 的 VS 商业扩展。我们在 v3.1 中添加了 LINQ Debugging in v3.0support for LINQ2Entities
【解决方案3】:

您可以在自己的任何代码上添加断点。

所以把光标放在'x.e',然后按F9。

【讨论】:

  • 是的,你可以设置断点,但如果代码由实体框架(Linq to Entities)执行,它们不会被击中。
【解决方案4】:

对于任何未来的读者,它现在已包含在 Visual Studio 中。从 Visual Studio 2015 Preview 开始,您现在可以在调试期间调试 lambda 表达式。包括 Watch、QuickWatch 和 Immediate 在内的所有调试窗口都支持 lambda 表达式求值。你可以阅读更多关于这个here的信息。

【讨论】:

    【解决方案5】:

    没有办法查看 xe 变量的值,因为 linq to orm 未执行,它被翻译/解释以生成 sql 查询。

    【讨论】:

      【解决方案6】:

      我必须在工具/选项/调试中“仅启用我的代码”。 为了查看 Lambda 方法之间的不同结果,我在它们之间放置了 .ToList()。

      【讨论】:

      • 我有VS 2015企业版,做了这个设置还是不行
      【解决方案7】:

      如果您使用 ToList(),则在使用 lambda 表达式调用的函数上运行调试。

      例子

      bool aFunction(int x) { return x < 10; }
      var l = new List<int>() { 5, 6, 11 }.Where(el => aFunction(el)).ToList();
      

      【讨论】:

        【解决方案8】:

        我不知道如何直接在 Visual Studio 中执行此操作,但您应该看看 LinqPad:http://www.linqpad.net/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-18
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多