代码之家  ›  专栏  ›  技术社区  ›  hugoware

linq-do.cast<t>()选择记录?

  •  3
  • hugoware  · 技术社区  · 17 年前

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

    command.cast()是否会导致执行查询(以及将来如何告诉这些内容?)。例如…

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

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

    3 回复  |  直到 14 年前
        1
  •  6
  •   user7116    17 年前

    Enumerable.Cast() 评论:

    此方法是通过使用延迟执行来实现的。即时返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用对象的getEnumerator方法或在Visual C中使用for each或在Visual Basic中为每个方法枚举对象之前,不会执行此方法表示的查询。

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

    • 骨料
    • 所有
    • 任何
    • 平均值
    • 包含
    • 伯爵
    • 要素
    • 元素默认值
    • 弗斯特
    • 首次违约
    • 最后
    • 最后期限
    • 朗伯特
    • 马克斯
    • 分钟
    • 序列相等
    • 单一的
    • 单一违约
    • 托托
    • 图典
    • 托利斯特
    • 托洛科普
        2
  •  3
  •   casperOne    17 年前

    不,不是。它只在迭代IEnumerable时执行强制转换。

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

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

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

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

    除此之外,如果它只是返回 IEnumerable<T> ,则很可能是延迟执行。然而,这并不意味着它是有保证的,它只是意味着它比可能的要多。

        3
  •  0
  •   FlySwat    17 年前

    你要找的是“延期执行”。只在尝试访问数据时才运行延迟执行的语句。像to list这样的语句会立即执行,因为需要将数据转换为列表。

    强制转换可以等到您实际访问它,所以它是一个延迟语句。