2013-01-07 77 views
3

我试图在我的c#代码中调试lamba,但似乎无论在哪里放入lambda,都不会进入它的断点。我把它放在第一个支架,最后一个支架,返回值,我想看到的价值变量,我能想到的所有东西,而且什么都没有。向Lambda函数添加断点

当试图调试lambda之外的任何行时,它没有问题,我做错了什么?

LAMBDA低于:

clientProgramList.Items.OfType<SPListItem>().Where(x => 
{ 
    DateTime doa = x.GetValue<DateTime>("client1"); 
    DateTime dod = x.GetValue<DateTime>("client2"); 
    bool date = DateCompare.IsValidClient(enteredDate, endDate, doa, dod); 
    return date; 
}); 
+1

除了下面的答案,请确保'clientProgramList.Items.OfType ()'实际上至少有一个项目。如果集合是空的,则不会调用“Where”谓词。 –

+0

另外,如果您有一个非平凡大小的列表,请考虑在数据库的数据库端执行查询,而不是在使用Linq到对象的内存中执行查询。 – Servy

+0

@AdamMaras它确实:)第一件事我检查 –

回答

11

只需调用Where方法不执行谓词的。

由于LINQ的延迟执行方法,只有在您尝试遍历返回值时才会执行谓词 - 在这种情况下,您似乎忽略了这一点。

所以,如果你这样做:

var items = clientProgramList.Items.OfType<SPListItem>().Where(x => 
{ 
    DateTime doa = x.GetValue<DateTime>("client1"); 
    DateTime dod = x.GetValue<DateTime>("client2"); 
    bool date = DateCompare.IsValidClient(enteredDate, endDate, doa, dod); 
    return date; 
}); 

int count = items.Count(); 

那么当您尝试执行Count()您的断点应该被击中。

+0

工作很好,谢谢乔恩! –

6

当你调用LINQ查询时,lambda没有被调用,而是只构造了查询。 Where子句是懒惰评估(只有当你开始迭代项目时)。尝试在查询结尾处添加ToList()并查看是否命中了断点。

0

您无法像调试其他代码一样调试lambda表达式。 lambda是'lazy'执行的,这意味着在使用该值之前不会对其进行评估。在此之前,它只是一个排队查询。

如果您试图追踪的错误是ArgumentException,那么很可能意味着clientProgramList.Items为空,您可以使用调试器轻松检查该错误。