【问题标题】:LINQ - Does .Cast<T>() Select Records?LINQ - .Cast<T>() 是否选择记录?
【发布时间】:2009-04-09 20:26:13
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# linq linq-to-sql records


    【解决方案1】:

    来自Enumerable.Cast()的言论:

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

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

    • 聚合
    • 全部
    • 任何
    • 平均
    • 包含
    • 计数
    • ElementAt
    • ElementAtOrDefault
    • 首先
    • FirstOrDefault
    • 最后
    • LastOrDefault
    • 长计数
    • 最大
    • 分钟
    • SequenceEqual
    • 单人
    • 单或默认
    • 总和
    • ToArray
    • 到字典
    • ToList
    • ToLookup

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      除此之外,如果它只是返回IEnumerable&lt;T&gt;,那么它很可能会推迟执行。然而,这并不意味着它是有保证的,它只是意味着它的可能性更大。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多