首页 > 解决方案 > 在 Linq 和 Exe 时间中使用 ToList()

问题描述

下面是我教科书中的一个例子:

var allGenres = from genre in myEntities.Genres.Include("Reviews")
                orderby genre.Name
                select new { genre.Name, genre.Reviews };
Repeater1.DataSource = allGenres.ToList();
Repeater1.DataBind();

这本书说:

只要您调用 ToList(),就会执行查询,并从数据库中检索相关的流派和评论并分配给 DataSource 属性

所以我的问题是,如果我摆脱Repeater1.DataSource = allGenres.ToList();var allGenres 包含什么?因为查询尚未执行?

标签: c#asp.netlinq

解决方案


需要三个阶段来理解。

  1. 首先,创建查询时。
  2. 其次,当查询变量被迭代时(延迟执行)。
  3. 第三,强制查询即时结果。

    var allGenres = from genre in myEntities.Genres.Include("Reviews") orderby genre.Name select new { genre.Name, genre.Reviews };

在此代码中,仅创建查询。它像一个人在墓地里死去。如果您需要延迟执行,则可以使用 for 循环等迭代结果。

要强制立即执行,您可以使用转换运算符,例如

ToList, ToArray, ToLookup, and ToDictionary. 

希望能帮助到你。

你可以在这一行设置断点:

var allGenres = from genre in myEntities.Genres.Include("Reviews")
            orderby genre.Name
            select new { genre.Name, genre.Reviews };

并注意到没有任何反应。在以下行之后,, SQL Profiler 将显示正在发生的 sql 查询:

Repeater1.DataSource = allGenres.ToList();

推荐阅读