gpt4 book ai didi

linq - IQueryable 和 IEnumerable 之间有什么区别

转载 作者:行者123 更新时间:2023-12-03 04:22:51 24 4
gpt4 key购买 nike

我对其中的区别感到困惑。作为 .Net 的新手,我知道我可以查询 IEnumerables使用 Linq 扩展。那么这是什么IQueryable它有何不同?

<小时/>

另请参阅What is the difference between IQueryable[T] and IEnumerable[T]?这与这个问题重叠。

最佳答案

IEnumerable<T>表示 T 的只进游标。 .NET 3.5 添加了扩展方法,其中包括 LINQ standard query operators喜欢 WhereFirst ,任何需要谓词或匿名函数的运算符都采用 Func<T> .

IQueryable<T>实现相同的 LINQ 标准查询运算符,但接受 Expression<Func<T>>对于谓词和匿名函数。 Expression<T>是一个已编译的表达式树,是该方法的分解版本(如果您愿意,可以称为“半编译”),可以由可查询的提供程序进行解析并相应地使用。

例如:

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

在第一个 block 中,x => x.Age > 18是一个匿名方法( Func<Person, bool> ),可以像任何其他方法一样执行。 Enumerable.Where将为每个人执行一次该方法,yield ing 方法返回的值 true .

在第二个区 block 中,x => x.Age > 18是一个表达式树 ( Expression<Func<Person, bool>> ),可以将其视为“'Age' 属性 > 18”。

这允许像 LINQ-to-SQL 这样的东西存在,因为它们可以解析表达式树并将其转换为等效的 SQL。并且因为提供程序不需要执行,直到 IQueryable被枚举(毕竟它实现了 IEnumerable<T> ),它可以组合多个查询运算符(在上面的示例中 WhereFirstOrDefault ),以对如何针对底层数据源执行整个查询做出更明智的选择(例如在 SQL 中使用 SELECT TOP 1)。

参见:

关于linq - IQueryable 和 IEnumerable 之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2433306/

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