无法进入或中断Linq查询/表达式内部调用的方法

Int*_*ble 2 c# linq ienumerable pagedlist visual-studio-2013

我遇到了一个奇怪的问题,试图进入一个从Linq查询中调用的方法(虽然我在使用Linq表达式时也遇到了问题).代码编译,它似乎工作(我得到了我期待的结果).

IEnumerable<TagBuilder> theOutcome = from r in resultSet
                                     select GetTableDataRow(null);
Run Code Online (Sandbox Code Playgroud)

要么

IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
Run Code Online (Sandbox Code Playgroud)

被调用的方法定义如下:

private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
    TagBuilder tr = new TagBuilder("tr");
    return tr;
}
Run Code Online (Sandbox Code Playgroud)

resultSet变量IPagedList包含两个项目.

该变量theOutcome最终TagBuilder按预期保存两个实例.

但是,GetTableDataRow()即使我在有问题的Linq查询之前或之前设置断点,我也不能介入.如果我在GetTableDataRow()方法中放置一个断点,那么它也不会出现这种情况.

我完全难过了.有人可以帮忙吗?Code现在显然非常简单,但是我需要在开发它时用调试器逐步完成该方法的内容.

Wai*_*Lee 9

您需要评估表达式.

只需致电ToArray(),ToList(),Count(),或任何其他方法或扩展上IEnumerable<T>,迫使评价.

Select使用延迟执行来评估结果,因此GetTableDataRow在使用查询之前不会发生任何事情.


更明确地说,您可以通过展开以下内容来看到这Select一点:

IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
Run Code Online (Sandbox Code Playgroud)

相当于

IEnumerable<TagBuilder> theOutcome = getRows(resultSet);
Run Code Online (Sandbox Code Playgroud)

在哪里getRows:

IEnumerable<TagBuilder> getRows(IEnumerable<IPagedList> source)
{
    foreach ( IPagedListitem in source )
        yield return GetTableDataRow(null);
}
Run Code Online (Sandbox Code Playgroud)

因为GetTableDataRowyield退回,它没有计算,直到评估被强制(例如,通过ToArray()等).