将断点添加到Lambda函数

时间:2013-01-07 21:37:51

标签: c# sharepoint lambda

我正在尝试在我的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;
});

3 个答案:

答案 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为空,这是您可以使用调试器轻松检查的内容。