如何调试Linq Lambda表达式?

时间:2013-06-21 08:47:36

标签: c# linq entity-framework debugging lambda

我正在使用Entity Framework和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
                     });

8 个答案:

答案 0 :(得分:75)

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

Debugging LINQ

请在Visual Studio的用户语音页面上投票赞成此建议:

Debug Lambda expressions

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

  

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

这是我当前的Visual Studio 2013中的实际操作:

enter image description here

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

答案 1 :(得分:8)

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

但你可以take a look将它翻译成什么SQL。 此外,如果您愿意遭受性能损失 - 您可以将其全部加载到Linq中以进行操作 - 并执行Step by step

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

我不知道如何在Visual Studio中直接使用它,但你应该看看LinqPad:http://www.linqpad.net/

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

示例

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