3

我正在尝试在我的 c# 代码中调试一个 Lamba,但似乎无论我在 lambda 中的哪个位置放置断点,它都不会进入它。我已经把它放在第一个括号,最后一个括号,return,我想看到的变量,我能想到的一切,但仍然没有。

当尝试调试 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;
});
4

3 回答 3

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()

于 2013-01-07T21:39:47.997 回答
6

当您调用该LINQ查询时,不会调用 lambda,而是仅构造查询。Where子句被延迟评估(仅当您开始迭代项目时)。尝试ToList()在查询末尾添加,看看是否命中断点。

于 2013-01-07T21:39:57.407 回答
0

您不能像调试其他代码一样调试 lambda。lambda 是“惰性”执行的,这意味着在使用该值之前不会对其进行评估。在那之前,它只是一个排队查询。

如果您尝试追踪的错误是 ArgumentException,则很可能意味着它clientProgramList.Items为 null,您可以使用调试器轻松检查这一点。

于 2013-01-07T22:07:51.977 回答