如何解决为什么第二个from子句在下面的LINQ查询中不执行?
{% extends 'luach/base.html' %}
{% block content %}
<div class="jumbotron">
{% for mydate in mydate %}
<h2>Hi{{ MyDate.hebrew_date }}</h2>
{% empty %}
<h2>Sorry,no dates in this list.</h2>
{% endfor %}
</div>
{% endblock %}
下面的日志文件的输出未显示如果执行第二个from子句将创建的日志消息。通过调用var startingDeck =
(from s in Suits().LogQuery("Suit Generation")
from r in Ranks().LogQuery("Rank Generation")
select new {Suit = s,Rank = r}).LogQuery("Starting Deck");
执行上述LINQ查询时,为什么不执行第二个from子句?
日志输出:
LogQuery("StartingDeck")
LogQuery是自定义扩展方法:
Executing Query Suit Generation
Executing Query Starting Deck
Suits和Ranks是迭代器方法:
public static IEnumerable<T> LogQuery<T>(this IEnumerable<T> sequence,string tag) {
// File.AppendText creates a new file if the file doesn't exist.
using (var writer = File.AppendText("StartingDeckQuery.log"))
{
writer.WriteLine($"Executing Query {tag}");
}
return sequence;
}
解决方法
这部分查询:
Ranks().LogQuery("Rank Generation")
...将针对“外部”查询中的每个值调用一次,即每套衣服一次。这就是SelectMany
(当有多个from
子句时使用的方法)的工作方式:它为“外部”查询中的每个项目评估“内部”查询。 (这就是为什么您可以在外部查询中使用“外部查询中的当前项目”的原因。)
但这只会在您开始迭代时发生。您没有显示任何实际上可以进行迭代的代码,这就是为什么您没有看到“ Rank Generation”日志记录的原因……而另外两行日志行仅用于评估“我有一个序列”,有效-他们渴望。
您可能会发现我的Edulinq article on SelectMany
有帮助,以获取更多详细信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。