gpt4 book ai didi

c# - LINQ - IEnumerable.ToList() 和延迟执行混淆

转载 作者:行者123 更新时间:2023-12-01 18:49:59 58 4
gpt4 key购买 nike

我有一个名为“query”的 IEnumerable 变量,它表示 Entity Framework 查询。如果我执行以下操作,它会多次枚举查询吗?我的困惑在于“结果”是 IEnumerable 而不是列表。

IEnumerable<T> result = query.ToList();
bool test = result.Any();

与此相反:

// Using List to only enumerate the query once
List<T> result = query.ToList();
bool test = result.Any();

另外,我知道这很愚蠢,但是如果我执行以下操作,它会枚举两次,还是会以某种方式知道“查询”已经被枚举,即使枚举的结果没有被使用?

List<T> result = query.ToList();
bool test = query.Any();

谢谢!

最佳答案

一旦您调用ToListToArray您将创建一个内存中的集合。从那时起,您就不再与数据库打交道了。

所以即使你将其声明为 IEnumerable<T>它实际上仍然是 List<T>之后query.ToList()

此外,所有相关的 LINQ 扩展方法都会检查序列是否可以转换为集合类型。例如,您可以在 Enumerable.Count 中看到这一点。 Count如果可能,将使用属性:

public static int Count<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
ICollection<TSource> collectionoft = source as ICollection<TSource>;
if (collectionoft != null) return collectionoft.Count;
ICollection collection = source as ICollection;
if (collection != null) return collection.Count;
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator()) {
checked {
while (e.MoveNext()) count++;
}
}
return count;
}

根据您的上一个问题,如果您在此代码片段中使用列表或再次使用查询会产生影响:

List<T> result = query.ToList();
bool test = query.Any();

是的,在这种情况下,您没有使用内存中的列表,而是使用查询,即使 .Any 不像 .ToList 那样昂贵,查询也会再次询问数据库。

关于c# - LINQ - IEnumerable.ToList() 和延迟执行混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529195/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com