如何调试Linq Lambda表达式?

38

我正在使用Entity Framework和Linq to Entities。

我想知道在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
                     });

8
您可以右键单击其中一个Lambda,然后选择“断点 -> 插入断点”来突出显示该Lambda。 - Adam Houldsworth
1
VS-2015将支持此功能。 :) - Pedram
8个回答

91

请确保阅读了官方MSDN文档:

调试LINQ

并请在Visual Studio的用户声音页面上投票支持此建议:

调试Lambda表达式

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

@Anonymous:您今天可以通过在lambda内部设置断点来实现这一点,从而使您能够检查进入和退出 lambda 的每个值。据我所知,您无法使用鼠标在 lambda 内部设置断点,必须使用键盘。将光标置于 lambda 主体内(例如,在第一个令牌或 => 和其后面的空格之后的任何位置),然后按 F9(或您用于放置断点的任何键盘快捷键)。仅 lambda 语句的内部将变为红色,并且调试器将在对 lambda 每个项进行评估时在该位置中断(因此,对于包含 100 个项的数组,使用 .Where() 将导致断点命中 100 次)。

这里是我当前的Visual Studio 2013中的演示:

enter image description here

如您所见,它运行得非常好,并允许我们查看正在测试的给定属性的值。这无疑是一种很棒的工具/救星! :)


2
太棒了,你的提示帮助我调试了许多对我来说完全是黑匣子的lambda表达式。谢谢! - Robert Dinaro
14
在编辑器中(VS2013)这看起来很好(只有lambda是红色的),但是当开始调试时,整个语句对我来说都变成红色,并且调试器会在外部语句上断开。:(你有什么想法吗? - Macke
3
这不是答案吗? - JsonStatham
4
我现在是2023年,无法回答您关于2022年的疑问。为什么? - XtianGIS

10

如果你正在使用Linq to Entities提供程序,那么你无法调试Lambda表达式。

但是你可以查看它翻译成的SQL语句。 此外,如果你愿意承受性能损失,你可以将所有内容加载到Linq to Objects中,并进行逐步操作。


2
我不会给你点踩,但是请看一下这个链接:https://dev59.com/-GQm5IYBdhLWcg3w6ShR#22518808 并找到一个相当好的解决方案。 - Daved
@Daved 嗯,如果 OP 使用的是 LinqToObjects,Leniel 就是正确的。但这不是 OP 的情况。OP 的 Lambda 是 LinqToEntities,而像 Leniel 建议的那样调试是行不通的。我已经更新了我的答案。 - Jens Kloster
1
好的,我漏读了那一部分。感谢你也编辑了你的解决方案。关于Linq到对象(Object)的内容请往下看。关于Linq到实体(Entity)的内容请往上看 :) - Daved
@JensKloster 请注意,该声明已不再适用 - 我们正在开发一款名为OzCode的商业扩展程序,我们在v3.0中添加了LINQ调试功能LINQ2Entities支持 - Omer Raviv

8
您可以在任何您自己的代码中添加断点。因此,请将光标放在“x.e”处,然后按下F9键。

2
是的,您可以设置断点,但如果代码由Entity Framework(Linq to Entities)执行,则不会触发它们。 - johey

3

对于未来的读者,现在Visual Studio已经包含了这个功能。从Visual Studio 2015预览版开始,您现在可以在调试期间调试lambda表达式。所有调试窗口,包括“监视”、“快速监视”和“立即执行”都支持lambda表达式的评估。您可以在这里了解更多信息。


1

无法查看 xe 变量的值,因为 Linq to ORM 不会被执行,它会被翻译/解释以生成 SQL 查询。


0

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


我有VS 2015企业版,已经进行了这个设置,但仍然无法正常工作。 - Adeem

0

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

示例

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

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接