我正在尝试在我的c#代码中调试lamba,但似乎无论在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;
});
答案 0 :(得分: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()
时,应该点击您的断点。
答案 1 :(得分:6)
当您调用LINQ
查询时,不会调用lambda,而是仅构建查询。 Where
子句被懒惰地评估(仅当您开始迭代项目时)。尝试在查询末尾添加ToList()
,看看是否遇到了断点。
答案 2 :(得分:0)
您无法像调试其他代码一样调试lambda。 lambda是'lazy'执行的,这意味着在使用该值之前不会对其进行求值。在那之前,它只是一个排队的查询。
如果您尝试追踪的错误是ArgumentException,则很可能意味着clientProgramList.Items
为空,这是您可以使用调试器轻松检查的内容。