无法进入或中断在 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);
}
因为 GetTableDataRow
是 yield
返回的,所以直到强制评估(例如 ToArray()
等)才对其进行评估。
我在尝试进入从 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);
}
因为 GetTableDataRow
是 yield
返回的,所以直到强制评估(例如 ToArray()
等)才对其进行评估。