首页
学习
活动
专区
圈层
工具
发布

.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)

,里面有三个属性分别是"OrderName(订单名称)"、"OrderTime(下单时间)"、"OrderCode(订单编号)",后面我们将通过这三个属性来配合示例的完成。...每当Where过后紧接着Select他们是如何关联一个完整的查询的?IQueryableT>并非IEnumerableT>对象,无法实时的做出处理然后将结果返回给下一个方法接着执行。...这幅图重点是IQueryableT>对象的连续操作,大致原理是每次执行扩展方法的时候都会构造一个新的IQueryableT>,本次的IQueryableT>对象将包含上次执行的表达式树,以此类推就形成了一颗庞大的表达式树...3.3】.分段执行IQueryableT>中的子方法(Queryable中的扩展方法) 都知道Linq的查询是将一些关键字拼接起来的,行成连续的查询语义,这其中背后的原理文章上上下下也说过很多遍,我想也应该大致的了解了...Provider属性,该属性是IQueryProvider接口,根据注释说明我们搞懂了它是最后执行查询的提供程序,我们理所当然的把IQueryableT>的开始实例当成了查询的入口,并且在连续调用的扩展方法当中它都保持唯一的一个实例

1.8K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    .NET面试题系列 - LINQ to SQL与IQueryable

    将查询表达式转换为SQL语句并不保证一定可以成功。 IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。...它令IQueryable和IEnumerable一样,拥有强大的查询能力。 AsQueryable方法将IEnumerableT>转换为IQueryableT>。...在LINQ to SQL中lambda表达式首先被转化为表达式树,然后再转换为SQL语句。 我们试图实现一个可以将where这个lambda表达式翻译为SQL语句的查询提供器。...另外,IQueryableT>还有三个属性: Expression:这个很好理解,就是要处理的表达式 Type IQueryProvider:你自己的IQueryProvider。...将程序员从对SQL语句的拼接(尤其是insert)中解放出来,它既容易错,又很难发现错误。现在插入的对象都是强类型的,就犹如插入一个List一样。

    2K10

    Asp.Net Core 扩展 Linq,简化自定义

    c# 扩展方法 在 Asp.Net Core 开发中或者其他的后端开发中都会有一个需求(尤其对于中台或者后台管理),那就是展示数据列表;当然不是普普通通的数据列表展示,而是需要进行排序、分页、查询关键字来获取列表...出来属性进行查询的,但是实际使用中,从前端传递过来的一般都是字符串 "Name",而在后端进行查询时,以目前方式是无法将属性的key写到where函数中,也就无法执行查询通过"Name"来过滤数据;如果通过...if...else 来判断,那么将会是一个非常大的工程量,每个实体上面有 m 个属性,而一个项目中有 n 张表,那么几乎需要 m*n个判断进行处理,非常的差劲,不利于后续扩展和维护。...(T)); // 通过传递过来的属性字符串获取对应的属性 MemberExpression property = Expression.Property(x, propertyName...(); // 将属性key字符串传递进来就可以实现查询和排序,方便使用,PropertyName可以随意更改,当PropertyName不属于查询的类型中时,只会抛出错误,需要进一步处理

    2K10

    .NET 2.0运行时的LINQ

    Stum..: 有一些"黑客"涉及使用3.5 Framework中的System.Core.dll使其与.net 2.0一起运行,但我个人不希望使用这样一个有点摇摇欲坠的基础....请参见此处:.NET 2.0上的LINQ支持 创建一个新的控制台应用程 仅将System和System.Core保留为引用的程序集 为System.Core将Copy Local设置为true,因为它在...基本上,任何只有"语法糖"的东西和新的编译器(C#3.0,VB 9.0)都会发布兼容2.0的IL.这包括LINQ使用的许多功能,例如匿名类,作为匿名委托的lambdas,自动属性,对象初始值设定项和集合初始值设定项...LINQ to SQL和LINQ到实体需要许多新的类(DataContext/ ObjectContext,大量的属性,EntitySet,EntityRef,Link,IQueryable,等)和表达式树...as IEnumerable(of R)    'do the transformation... end function IQueryable扩展方法将表达式树作为参数

    72410

    Entity Framework快速入门--IQueryable与IEnumberable的区别

    也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable...为了区别两个接口,我们通过一个实际的例子来解释一下。...接口的集合中 IQueryableT_Class> classesIQue = (from c in schoolEntities.T_Class...第一种:直接返回 IQueryable类型的查询,如下图所示: 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: 总结 IQueryable接口与IEnumberable...接口的区别:  IEnumerableT> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryableT> 是将Skip ,take 这些方法表达式翻译成

    58650

    EF Core关系配置

    属性赋值(当前赋值也不会出错),也不需要显式地把新创建的Comment类型的对象添加到DbContext中。...获取指定字段 var a1 = dbContext.Articles.Select(x => new {x.Id, x.Title}).First(); 只获取外键id 1、在实体类中显式声明一个外键属性...导航属性 由一个属性可以访问到另外一种类型的实体叫做导航属性 单向导航:不设置反向的属性,然后配置的时候WithMany()不设置参数即可。...的延迟执行 1、IQueryable只是代表一个“可以放到数据库服务器去执行的查询”,它 没有立即执行,只是“可以被执行”而已。...IQueryable的复用 IQueryable是一个待查询的逻辑,因此它是可以被重复使用的 IQueryable books = ctx.Books.Where(b => b.Price

    62210

    .NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

    最为常见的就是遍历树形结构的对象,如:XML,它的每个节点都是一样的对象,所以递归调用的方法也是同一个方法,只不过不断的调用将产生多个调用栈,最后在按照调用顺序的反向出栈就得出一个完整的数据结构。...那么在LINQ中来说,我们无法通过一个方法多次调用来产生我们想要的表达式树,一个Where查询表达式扩展方法可能不仅仅是被LINQ查询表达式所使用,还有可能被ORM的入口方法所使用,比如Update更新的时候就需要...IQueryableT>接口貌似是一个对象,但是它们都属于一个完整的IQueryableT>中的一员。N层对象体现在哪里?...从一开始的IQueryable被扩展方法所处理就已经开始第一层的对象处理,重复性的环路假递归似的调用就形成N层对象模型。...5】.IQueryableT>与IQueryProvider一对一的关系能否改成一对多的关系 IQueryable对象都有一个配套的IQueryProvider对象,在频繁的创建IQueryable的时候都会重新创建

    1.3K30

    ASP.NET MVC5+EF6+EasyUI 后台管理系统(17)-LinQ动态排序

    首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使20行的代码精简成2行...,我查阅了一些资料,借鉴了一些大神的建议,首先感谢第八讲中,11楼@nyth和15楼@红颜醉丶帝的建议投递,每一次的的排序要都一个判断这的确很麻烦,我们利用反射来解决这个问题。...param = Expression.Parameter(typeof(T), sortExpression); 我们们传入的类型中找出我们需要进行排序的字段。...PropertyInfo pi = typeof(T).GetProperty(sortExpression); 取出要排序字段的相关属性   Type[] types = new Type[2];   ...queryData = LinqHelper.DataSorting(queryData,pager.sort,pager.order); 我们的代码顿时精简成了一行,赞一个吧。

    91350

    了解LINQ

    ()) { Console.WriteLine(enumerator.Current); } 输出结果: Cat Dog Pig ----------- Cat Dog Pig 而能被LINQ的对象就是一个实现了...IEnumerable的可被枚举的集合 LINQ的基本用法 扩展方法在LINQ的应用:LINQ的流式语法 LINQ的方法一般都是通过扩展方法了扩展的,就如最常用的几个,Where,Any,例如,我实现了一个跟...: CAT DOG LINQ的延迟执行:IQueryable 首先我们来看看IQueryable的接口定义: public interface IQueryable : IEnumerable...是继承了IEnumerable,因此同样具备其特性,然后主要看其三个属性: ElementType:集合的类型 Expression:表达式树,这是延迟执行的重点,下面我们会一窥究竟 IQueryProvider...里的那个表达式树属性Expression,而像LINQ To Sql或者是EFCore等需要IQueryable这种解释型的就是去实现了IQueryProvider里面的方法 参考 《C#7.0核心技术指南

    1.1K20

    asp.net core 上使用redis探索(3)--redis示例demo

    >(T item); T GetT>(string id); IQueryableT> GetAllT>(); IQueryableT> GetAllT>(string...在构造函数中根据配置连接redis服务器。 aps.net-core给我们提供了强大的配置功能,使用强类型的Options,一般,我们实现一个继承自IOptions的类。...由于IOptions接口定义了一个Value属性,我们可以通过这个属性来获取配置类的实例。...最后就是最重要的部分了。ASP.NET-CORE框架随处可见的都是依赖注入。上面所有的程序,都是一个接口对应着一个类。所谓的依赖注入,其实就是继承自接口的类的实例化过程,但是这个过程是解耦的!...从上面的过程中,我们看到有两个构造函数的注入过程,因此,我们需要实现两个DI,分别是配置类的DI和redis客户端类的DI。

    39010

    .NET中数据访问方式(一):LINQ

    IQueryableT>继承自IEnumerableT>,是个标记接口。...可查询类型无需额外操作即可进行LINQ操作,若数据源在内存中不以可查询类型的形式存在,那么LINQ提供程序必须要先将数据源转换为可查询类型,如LINQ to XML将XML文件转换为可查询的XElement...扩展方法(又称为标准查询) System.Linq.Enumerable类和System.Linq.Queryable类,分别针对IEnumerableT>和IQueryableT>接口进行的扩展。...两个接口 在LINQ中,一个查询表达式被编译为表达式树或者委托,查询结果为IEnumerableT>类型则被编译为委托,查询结果是IQueryable或IQueryableT>类型则被编译为表达式树...System.Linq.IQueryableT> 在执行查询操作时,IQueryable先在服务器端进行过滤操作(如果有的话),然后再将数据放到本地内存中。

    3.2K30

    编写高质量代码改善C#程序的157个建议

    本文主要学习记录以下内容:   建议29、区别LINQ查询中的IEnumerableT>和IQueryableT>   建议30、使用LINQ取代集合中的比较器和迭代器   建议31、在LINQ查询中避免不必要的迭代...建议29、区别LINQ查询中的IEnumerableT>和IQueryableT>   LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:     Enumerable...稍加观察我们会发现,接口IQueryableT>实际也是继承了IEnumerableT>接口的,所以致使这两个接口额方法在很大成都上是一致的。...LINQ to SQL引擎最终会将表达式树转化成为相应的SQL语句,然后在数据库中执行。   那么到底什么时候使用IQueryableT>,什么时候使用IEnumerableT>呢?...在LINQ to SQL的查询中,要尽量始终使用IQueryableT>。

    1.2K50

    IEnumerable和IQueryable区分

    IQueryableT>接口的集合进行扩展。...我们会发现接口IQueryableT>实际也是继承了IEnumerableT>接口的,既然这样微软为什么要设计出两套扩展方法呢?...针对LINQ to OBJECTS 时,使用Enumerable中的扩展方法对本地集合进行排序和查询操作,查询参数接受的是Func,Func叫做谓语表达式,相当于一个委托。...针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression。 那么,到底什么时候使用IQueryableT>,什么时候使用IEnumerableT>?...虽然我们使用两条语句进行了查询,但最终只生成了一条SQL语句,将查询参数合并了。 第二代码效果: ? 这一次我们依然只看到一条SQL语句,但查询条件也只有一个,但两次查询的结果是一致。

    1.1K20

    C#3.0新增功能09 LINQ 标准查询运算符 01 概述

    这些方法中的大多数都作用于序列;其中序列指其类型实现 IEnumerableT> 接口或 IQueryableT> 接口的对象。 标准查询运算符提供包括筛选、投影、聚合、排序等在内的查询功能。...共有两组 LINQ 标准查询运算符,一组作用于类型 IEnumerableT> 的对象,另一组作用于类型 IQueryableT> 的对象。...此外,多个标准查询运算符方法作用于那些基于 IEnumerableT> 或 IQueryableT> 的类型外的类型。...对于在内存中集合上运行的方法(即扩展 IEnumerableT> 的那些方法),返回的可枚举对象将捕获传递到方法的参数。 在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。...与之相反,扩展 IQueryableT> 的方法不会实现任何查询行为,但会生成一个表示要执行的查询的表达式树。 源 IQueryableT> 对象执行查询处理。

    83320
    领券