4

我注意到某些命令会导致 LINQtoSQL 连接到数据库并下载属于查询一部分的记录,例如 .ToArray()。

命令 .Cast() 是否会导致执行查询(以及将来如何告诉这些事情?)。例如...

IRevision<T> current = context.GetTable(typeof(T))
    .Cast<IRevision<T>>()
    .SingleOrDefault(o => o.ID == recordId);

我知道 .GetTable 有一个命令允许您指定泛型类型,但由于奇怪且无法解释的原因,它不能在这种情况下使用。

4

3 回答 3

7

Enumerable.Cast()的评论:

该方法是通过使用延迟执行来实现的。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 Visual C# 中的 foreach 或 Visual Basic 中的 For Each 枚举对象之前,不会执行此方法表示的查询。

所有 LINQ 运算符都会让您知道它们是延迟执行还是立即查询执行。此外,以下是未延迟的标准 LINQ 运算符:

  • 总计的
  • 全部
  • 任何
  • 平均的
  • 包含
  • 数数
  • 元素
  • ElementAtOrDefault
  • 第一的
  • 第一或默认
  • 最后的
  • 最后或默认值
  • 长计数
  • 最大限度
  • 序列相等
  • 单身的
  • 单一或默认
  • 数组
  • 到字典
  • 列表
  • 去查查看
于 2009-04-09T20:29:55.300 回答
3

不,不是的。当您遍历 IEnumerable 时,它​​只会执行强制转换。

没有任何确定的方法(在代码中)可以知道方法是否会使用延迟执行。该文档将成为您最好的朋友,因为它会告诉您它是否推迟执行。

但是,这并不意味着如果文档不清楚,您就不能做出一些假设。

如果您有一个返回另一个列表/结构(如 ToList、ToArray)的方法,那么它必须执行查询才能填充新的数据结构。

如果该方法返回一个标量值,那么它将必须执行查询以生成该标量值。

除此之外,如果它只是简单地返回IEnumerable<T>,那么它很可能会推迟执行。但是,这并不意味着它是有保证的,它只是意味着它很有可能。

于 2009-04-09T20:29:57.937 回答
0

您正在寻找的内容称为“延迟执行”。延迟执行的语句仅在您尝试访问数据时运行。ToList 等语句会立即执行,因为需要将数据转换为列表。

Cast 可以等到你真正访问它,所以它是一个延迟语句。

于 2009-04-09T20:30:44.707 回答