我注意到某些命令导致LINQtoSQL连接到数据库并下载作为查询一部分的记录,例如.ToArray()。
命令.Cast()是否会导致执行查询(以后如何判断这些事情?)。例如......
IRevision<T> current = context.GetTable(typeof(T))
.Cast<IRevision<T>>()
.SingleOrDefault(o => o.ID == recordId);
我知道.GetTable有一个命令允许你指定泛型类型,但由于奇怪和无法解释的原因,它不能在这种情况下使用。
答案 0 :(得分:7)
来自Enumerable.Cast()的评论:
此方法通过使用延迟执行来实现。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询。
所有LINQ运算符都会告诉您它们是延迟执行还是立即执行查询。另外,以下是不推迟的标准LINQ运算符:
答案 1 :(得分:3)
不,它没有。它只是在迭代IEnumerable时执行转换。
没有任何明确的方法(代码中)知道方法是否会使用延迟执行。文档将成为您最好的朋友,因为它会告诉您它是否会延迟执行。
但是,如果文件不清楚,这并不意味着你不能做出一些假设。
如果你有一个返回另一个列表/结构的方法(比如ToList,ToArray),那么它必须执行查询才能填充新的数据结构。
如果方法返回标量值,则必须执行查询以生成该标量值。
除此之外,如果它只是返回IEnumerable<T>
,那么它更可能是推迟执行。然而,这并不意味着它得到保证,只是意味着它更有可能。
答案 2 :(得分:0)
您正在寻找的是“延期执行”。延迟执行的语句仅在您尝试访问数据时运行。诸如ToList之类的语句立即执行,因为需要数据将其转换为列表。
Cast可以等到你实际访问它,所以它是一个延迟语句。