23.C#Queryable的扩展方法(十二章12.1-12.2)

  今天要写的知识还真心有点绕呢,对于第一节的内容,其实是把原先在内存中的数据源,换成了从数据库中提取出来的数据。从代码的使用方式上是一样的,直接跳过,来看看IEnumerable和IQueryable的区别。

  正如Enumerable类型包含着关于IEnumerable<T>的扩展方法来实现LINQ标准查询操作符一样,Queryabl类型包含着关于IQueryable<T>的扩展方法。IEnumerable<T>和IQueryable<T>有两个重要的区别。

  首先IEnumerable<T>的方法都使用委托作为参数,例如,Select方法使用Func<TSource,TResult>。这对于内存中的操作是没有问题的,但对于别处执行查询的LINQ提供器来说,我们需要能执行更详细检查的格式--表达式树。例如,Queryable中相应的Select的重载就要获取类型为Expression<Func<TSource,TResult>>的参数。编译器根本不会关心这些--在查询编译之后,它具有一个需要作为参数传递给方法的Lambda表达式,而Lambda表达式即可以被转换成委托实例,也可以转换成表达式树。如图中的表示,会根据数据源选择相应的重载。

  选择两种路径的查询,具体使用哪个路径取决于数据源实现的是IQueryable接口还是IEnumerable接口。

  当我们将Lambda表达式传入作为参数时,Lambda表达式即可以转换成委托实例,也可以转换成表达式树实例,左边的路径用于执行内存中的操作,而右边路径用于来在数据库中执行SQL。

  Queryable和Enumerable之间的第2个重大差别,Enumerable的扩展方法会完成与对应查询操作符相关的实际工作(至少会构建完成这些工作的迭代器)。例如,Eumerable.Where中的代码执行相关的过滤操作,并在结果序列中生成适当的元素。通过比较,Queryable中的查询操作符的"实现"做的事情非常少。

  •  IQueryable<T>和相关接口的介绍

  IQueryable<T>是从IEnumerable<T>和非泛型的IQueryable继承而来,而IQueryable又继承于非泛型IEnumerable,IQueryable仅有三个属性:QueryProvider、ElementType和Expression。理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。从LINQ的角度来看,由于是通过IQueryable的Expression属性返回结果,所以查询的详细信息就保存于表达式树中。

  请大家给出深入见解,学习一二,斧正。

posted on   a2htray  阅读(2256)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示