gpt4 book ai didi

c# - 是否可以为 linq-to-objects 编译查询

转载 作者:太空狗 更新时间:2023-10-29 22:11:27 25 4
gpt4 key购买 nike

我有一个在递归循环中查询对象的 linq,当对象接近超过 1000 个并且网站上有超过 100 个用户时,我担心我的网站会崩溃。那么是否可以编译 linq to objects 查询。

linq 查询仅查找节点的直接子节点。

最佳答案

要了解为什么编译 的概念对于 LINQ to Object 查询没有真正意义,了解 LINQ 的实现方式很有用。首先,应该清楚的是,无论您使用的是哪种 LINQ 变体,C# 编译器都会在编译时将以流畅语法编写的 LINQ 查询转换为等效的方法调用语法:

from person in people
where person.Age < 18
select person.Name
// will be converted to:
people.Where(person => person.Age < 18).Select(person => person.Name)

从现在开始,LINQ 查询基本上是一组采用一些参数并通常转换 IEnumerable<T> 的方法调用。反对另一个IEnumerable<T>目的。延迟执行与编译不同,它只是通过不从原始 IEnumerable<T> 中获取任何对象来实现的。直到你遍历输出 IEnumerable<T> .基本上,具有延迟执行的方法在不触及原始集合的情况下象征性地对其参数进行操作,从而构建一个可以根据需要查询内容的生成器。

考虑到这一点,看看 lambda 表达式 person => person.Age < 18在上面的表达式中。它需要一个 Person对象并返回 bool . Lambda 表达式是无类型的;它们可以被视为表达式树或匿名方法,具体取决于从中推断出它们的类型的上下文。在这种情况下,类型是从 Where 的参数类型推断出来的。扩展方法。这就是 LINQ to SQL 和 LINQ to Object 的区别所在。在 LINQ to Objects 中,Where方法只需要 Func<Person, bool>而不是 Expression<Func<Person, bool>> .这实质上意味着在 LINQ to Objects 中,C# 编译器将 lambda 表达式编译为匿名方法并在编译时 生成 IL,并将该方法的委托(delegate)传递给 Where .

在其他 LINQ 变体中,例如 LINQ to SQL,lambda 编译为 IL。相反,编译器从 lambda 表达式构建一个表达式树对象,并将表达式树传递给 LINQ 方法。 LINQ 方法使用这些表达式树来构建用于查询内容的模型。运行查询时,为使用表达式树表示查询而构建的对象模型将转换为另一种东西(取决于使用的 LINQ 变体),如 LINQ to SQL 中的 SQL 语句,以便在数据库上执行。此转换过程在运行时完成,这就是我们所说的LINQ 查询编译

综上所述,问题是编译成什么? LINQ to Object 在运行时不需要编译的原因是它首先不是表达式树格式;已经是IL了。

与正常循环相比,您几乎不需要担心 LINQ to Objects 的性能。

关于c# - 是否可以为 linq-to-objects 编译查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649874/

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