无法进入或中断在 Linq 内部调用的方法 query/expression

Unable to step into or break in method called inside Linq query/expression

我在尝试进入从 Linq 查询中调用的方法时遇到了一个奇怪的问题(尽管我在使用 Linq 表达式时也遇到了这个问题)。代码可以编译,而且似乎可以正常工作(我得到了预期的结果)。

IEnumerable<TagBuilder> theOutcome = from r in resultSet
                                     select GetTableDataRow(null);

IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));

被调用的方法定义如下:

private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
    TagBuilder tr = new TagBuilder("tr");
    return tr;
}

resultSet 变量是一个包含两项的 IPagedList

变量 theOutcome 最终如预期持有两个 TagBuilder 实例。

但是,我无法进入 GetTableDataRow(),即使我在相关的 Linq 查询上或之前放置了一个断点。如果我在 GetTableDataRow() 方法中放置一个断点,它也永远不会命中。

我完全被难住了。谁能帮忙?代码现在显然非常简单,但我需要在开发它时使用调试器逐步完成该方法的内容。

您需要计算表达式。

只需在 IEnumerable<T> 上调用 ToArray()ToList()Count() 或任何其他强制计算的方法或扩展。

Select 的结果是使用 deferred execution 计算的,因此在使用查询之前 GetTableDataRow 不会发生任何事情。


更明确地说,您可以通过展开 Select 的功能来了解这一点:

IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));

相当于

IEnumerable<TagBuilder> theOutcome = getRows(resultSet);

其中 getRows 是:

IEnumerable<TagBuilder> getRows(IEnumerable<IPagedList> source)
{
    foreach ( IPagedListitem in source )
        yield return GetTableDataRow(null);
}

因为 GetTableDataRowyield 返回的,所以直到强制评估(例如 ToArray() 等)才对其进行评估。