32

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

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

我更感兴趣的是查看 xe.. 的值,而不是生成的 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
                     });
4

8 回答 8

88

确保您阅读了有关此问题的官方 MSDN 文档:

调试 LINQ

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

调试 Lambda 表达式

Allon Guralnek在 2014 年3 月 18 日下午 12:37评论了一种仅使用键盘设置断点的方法:

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

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

在此处输入图像描述

正如您所看到的,它运行得非常好,并且允许我们查看正在测试的给定属性的值。这肯定是一个很棒的工具/救生员!:)

于 2014-03-19T21:46:45.977 回答
10

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

但是你可以看看它翻译成什么 SQL。另外,如果您愿意遭受性能损失-您可以将其全部加载到 Linq 中以进行对象-并逐步执行

于 2013-06-21T08:54:07.457 回答
8

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

所以把光标放在'xe',然后按F9。

于 2013-06-21T08:52:44.347 回答
3

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

于 2014-11-13T04:46:01.713 回答
1

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

于 2013-06-21T08:53:46.017 回答
0

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

例子

bool aFunction(int x) { return x < 10; }
var l = new List<int>() { 5, 6, 11 }.Where(el => aFunction(el)).ToList();
于 2019-01-25T10:21:08.513 回答
0

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

于 2016-01-10T17:40:20.553 回答
-1

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

于 2013-06-21T08:51:41.030 回答