LINQ - .Cast <t>()选择记录吗?</t>

时间:2009-04-09 20:26:14

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

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

命令.Cast()是否会导致执行查询(以后如何判断这些事情?)。例如......

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

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

3 个答案:

答案 0 :(得分:7)

来自Enumerable.Cast()的评论:

  

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

所有LINQ运算符都会告诉您它们是延迟执行还是立即执行查询。另外,以下是不推迟的标准LINQ运算符:

  • 聚合
  • 所有
  • 任何
  • 平均
  • 包含
  • 计数
  • 的ElementAt
  • ElementAtOrDefault
  • 第一
  • FirstOrDefault
  • 最后
  • LastOrDefault
  • LongCount
  • 最高
  • 最小
  • SequenceEqual
  • 的SingleOrDefault
  • 萨姆
  • ToArray的
  • ToDictionary
  • ToList
  • ToLookup

答案 1 :(得分:3)

不,它没有。它只是在迭代IEnumerable时执行转换。

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

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

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

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

除此之外,如果它只是返回IEnumerable<T>,那么它更可能是推迟执行。然而,这并不意味着它得到保证,只是意味着它更有可能。

答案 2 :(得分:0)

您正在寻找的是“延期执行”。延迟执行的语句仅在您尝试访问数据时运行。诸如ToList之类的语句立即执行,因为需要数据将其转换为列表。

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