c# - 在 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 包含什么?因为查询尚未执行?
解决方案
需要三个阶段来理解。
- 首先,创建查询时。
- 其次,当查询变量被迭代时(延迟执行)。
第三,强制查询即时结果。
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();
推荐阅读
- python - 我该如何做到,如果 XPATH 在网站上没有看到元素,它会跳过该行并移动到下一行?
- r - R中的动态函数名称
- javascript - Javascript - 用分号分割字符串的正则表达式,除非它在单引号或双引号内使用
- java - 滚动 RecyclerView 时绑定的 ImageView 消失
- csv - 根据 Rust 中的文件名读取 CSV 或压缩的 CSV
- azure - 无法在 Azure 上的 Linux 容器中为 .net Core Kestral 服务器配置 HTTPS 端点
- java - 如何巧妙地处理标志以避免警告“此表达式始终计算为真”
- nearprotocol - 您如何在 NEAR 上创建帐户?
- r - 无法下载完整的 db 文件
- javascript - 您可以在没有互联网连接时禁用链接并在互联网连接恢复时启用它们吗?