我在尝试进入从 Linq 查询中调用的方法时遇到了一个奇怪的问题(尽管我在使用 Linq 表达式时也遇到了这个问题)。代码可以编译,并且看起来可以工作(我得到了我期望的结果)。
IEnumerable<TagBuilder> theOutcome = from r in resultSet
select GetTableDataRow(null);
OR
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
被调用的方法定义如下:
private static TagBuilder GetTableDataRow(IEnumerable<object> rowData)
{
TagBuilder tr = new TagBuilder("tr");
return tr;
}
The resultSet
变量是一个IPagedList
其中包含两个项目。
变量theOutcome
最终持有两个TagBuilder
实例符合预期。
但是,我无法进入GetTableDataRow()
,即使我在相关 Linq 查询上或之前放置了一个断点。如果我在GetTableDataRow()
方法,它也从来没有击中那个。
我完全被难住了。有人可以帮忙吗?现在代码显然非常简单,但在开发时我需要使用调试器单步执行该方法的内容。
您需要评估表达式。
只需致电ToArray()
, ToList()
, Count()
,或任何其他方法或扩展IEnumerable<T>
这迫使评估。
的结果Select
评估使用延迟执行 https://weblogs.asp.net/dixin/understanding-linq-to-sql-6-working-with-deferred-execution,所以没有任何反应GetTableDataRow
直到使用查询。
更明确地说,您可以通过扩展内容来看到这一点Select
does:
IEnumerable<TagBuilder> theOutcome = resultSet.Select(r => GetTableDataRow(null));
相当于
IEnumerable<TagBuilder> theOutcome = getRows(resultSet);
where getRows
is:
IEnumerable<TagBuilder> getRows(IEnumerable<IPagedList> source)
{
foreach ( IPagedListitem in source )
yield return GetTableDataRow(null);
}
Because GetTableDataRow
is yield
返回,直到强制评估(例如通过ToArray()
, etc.).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)