我正在使用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
});
答案 0 :(得分:75)
请务必阅读有关此问题的官方MSDN文档:
请在Visual Studio的用户语音页面上投票赞成此建议:
Allon Guralnek评论 2014年3月18日下午12:37 关于仅使用键盘设置断点的方法:
@Anonymous:你今天可以通过在内部设置一个断点来做到这一点 lambda,从而使您能够检查进来的每个值 走出lambda。据我所知,你不能在里面设置一个断点 使用鼠标的lambda,你必须使用键盘。放光标 在lambda体内(例如在第一个标记上,或者在第一个标记之后的任何内容) =&GT;然后按F9(或用于放置断点的任何键盘快捷键)。只有里面 lambda语句将变为红色,调试器将在那里中断 对于每个项目,lambda被评估(因此对于100的数组) 项目,使用.Where()将导致断点达到100次。
这是我当前的Visual Studio 2013中的实际操作:
正如您所看到的,它可以很好地工作,并允许我们查看正在测试的给定属性的值。这肯定是一个很棒的工具/救生员! :)
答案 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)
没有办法看到x
和e
变量的值,因为没有执行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();