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

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

2】.扩展Linq to Object (应用框架具有查询功能) 我们知道LINQ所支持的查询范围主要在IEnumerable、IQueryable这两个方面,对于我们想要扩展LINQ的查询能力也主要集中在这两块...我假设使用List来保存一批订单的信息,但是根据业务逻辑需要我们要通过提供一套独立的扩展方法来支持对订单集合数据的处理。这一套独立的扩展方法会跟随着当前系统部署,不作为公共的开发框架的一部分。...3.2】.扩展方法的扩展对象之奥秘(this IQueryable source) 其实这里有一个思维陷阱,当我们分析源码的时候只将焦点集中在扩展方法中的后面参数上,而没有集中精力考虑扩展方法所扩展的对象本身...这个方法有一个参数,是条件表达式,并且这个方法扩展IQueryable接口,任何派生着都能直接使用。...方法中有两个判断,第一个是判断是否是通过扩展方法方式调用代码的,防止我们直接使用扩展方法,第二个判断是确定我们是否提供了表达式。 那么重点是最后一行代码,它包裹着几层方法调用,到底是啥意思呢?

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

    .NET深入解析LINQ框架(二:LINQ优雅的前奏)

    1】.LINQ框架的主要设计模型 到了这里我们似乎隐隐约约的能看见LINQ的原理,它不是空中花园,它是有基础的。...在上面的一系列新特性的支持下,微软通过大面积的构建扩展方法使得上述特性能连贯的互相作用,形成自然的集成查询框架。...return ORMHelper.FindEntityList(model); 10 } ORMHelper.FindEntityList 是一段根据实体现有属性查询对象列表的泛型方法...2.4.深入IQueryable、IQueryable、Queryable(LINQ to Provider框架的入口) IQueryable接口是提供给我们来实现自定义数据源用的,为了支持强类型的数据源集合我们直接使用...IQueryable接口,当我们使用LINQ来查询IQueryable接口时查询表达式会被直接编译成对应的Queryable静态类中的对应的静态扩展方法。

    2.9K30

    使用ORM框架,必须迁就数据库的设计吗?

    对高端用户来说,支持多数据库并不是唯一的需要,他们需要稳定、高效以及高伸缩性和可扩展性。说到底,还是定位问题。...可能我有10个WebRole,并发访问数据库,数据一致性怎么保证? - 非常复杂的数据库关系和架构,比如多个外键,级联查询,唯一性约束,参照完整性约束。...--由于历史原因,框架最初定位在支持.NET2.0,IQueryable 是.NET 3.0以后才支持,目前正在考虑框架直接支持LINQ; (5)支持很多数据库固然很好,但是lz如何处理数据库方言问题?...--首先,框架不是个人闭门造车的产物,而是实实在在的项目应用的结果,比如最近我们做的银行基金分析系统,这样的系统复杂性和数据量自然不用怀疑的; 对于你的“对于泛型实体的支持”的问题,我想不是在泛型类本身支持实体的问题...--下面这个场景是否与你的这个问题类似?

    2.5K90

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

    IQueryable接口貌似是一个对象,但是它们都属于一个完整的IQueryable中的一员。N层对象体现在哪里?...从一开始的IQueryable被扩展方法所处理就已经开始第一层的对象处理,重复性的环路假递归似的调用就形成N层对象模型。...(ExpressionTree),手动构建过表达式树的朋友都会觉得很麻烦(对动态表达式有兴趣的可以参见本人的“.NET深入解析LINQ框架(三:LINQ优雅的前奏)”一文),所以我们可以通过直接编写Lambda...文章的最后将给出一个完整的Linq to Provider的小例子,喜欢扩展LINQ的朋友肯定会喜欢的。 ?...ORM一直是我们比较喜欢去写的框架,这里就使用自定义的IQueryable来查询相应的对象实体。首先我们需要继承IQueryable接口来让LINQ能查询我们自己的数据上下文。

    1.5K30

    DDD理论学习系列(12)-- 仓储

    然而当对复杂的领域模型进行建模时,仓储是模型的扩展,它表明聚合检索的意图,可以对领域模型进行有意义的读写,而不是一个技术框架。 也有很多人认为仓储是一种反模式,因为其隐藏了基础持久化框架的功能。...仓储方法需明确 仓储是原则上是领域模型与持久化存储之间明确的契约,仓储定义的接口方法不仅仅是CURD方法。它是领域模型的扩展,并以领域专家所理解的术语编写。...这个方法的设计思想无可置否,灵活且可以扩展,但是它并没有明确的表明查询的意图,我们就失去了对查询的控制。...返回IEnumerable会比较安全,但IQueryable提供了更好的灵活性。事实上,如果使用IQueryable作为返回值,我们仅提供一种读取数据的方法即可进行各种查询。...仓储的反模式(注意事项) 不要支持临时查询(ad hoc query) 仓储不应该开放扩展,不要为了支持多种形式的查询,定义比较宽泛的查询方法,它不仅不能明确表达仓储查询的意图,更可能会导致查询性能。

    2.4K70

    .NET3.5新特性,Lambda表达式

    支持象上面那样过滤任何IEnumerable集合的Where()扩展方法 可以使用下面这样的扩展方法代码来实现: ?...上面的Where()扩展方法接受一个 Func 类型的过滤参数,该参数是个接受一个类型为T的参数,返回一个布尔值表示条件是否满足的方法之代理。...IQueryable 接口 为 帮助框架开发人员建立可查询的数据提供器,LINQ提供了 IQueryable 接口。...当与Orcas中System.Linq命名空间下提供的内置标准查询扩展方法结 合使用时,它们提供了一个非常好的方式来对任何类型的数据进行查询和交互,同时还保持了对完整的编译时检查和intellisense...通 过利用由Lambda提供的对表达式树的支持,以及 IQueryable 接口,构建数据提供器的框架开发人员可以确保开发人员编写的干净的编码,对任何数据源(无论是数据库,XML文件,内存中的对象

    2.3K80

    金三银四面试:C#.NET面试题中高级篇5-Linq和EF

    实体框架EF是http://ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。...ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换。 (表实体跟表之间的相互转换) ORM框架有很多,EF框架是ORM框架的其中一种,是实现了ORM思想的框架。...功能也极大的提高开发和架构设计的效率. 3).EF跨数据支持的是ORM框架主要功能点之一,带来的是可以通过仅仅改变配置就可以做到跨数据库的能力 4.如何提高LINQ性能问题?...Enumerable这个静态类型含有很多扩展方法,其扩展的目标是IEnumerable。 实现了这个接口的类可以使用Foreach关键字进行迭代(迭代的意思是对于一个集合,可以逐一取出元素并遍历之)。...的扩展方法。

    5.8K30

    .net 温故知新:【10】.NET ORM框架EFCore使用入门之CodeFirs、DBFirst

    目的在于通过要点的梳理最后串联起整个跨平台框架。之前的几篇算是把框架重要设计和框架重要知识点复习了,当然什么系统都可能使用到ORM框架。...所以这里为了整个过程的完整连续性加入一个EFCore的示例,ORM不算详细写了,毕竟ORM框架可以根据需求选择很多,如果再详细那又是另外一个系列了,这里只做简单介绍。...它支持 LINQ 查询、更改跟踪、更新和架构迁移。...EFCore入门 在上面的EFCore介绍中我们又看到了提供程序描述,之前文章多次提到这个提供程序是.net框架中随处可见的,也就是通过这些不同的提供程序实现扩展和适配。...Iqueryable的作用和数据延迟加载,在我们查询数据的时候列表数据以Iqueryable类型返回,如果我们不是调用获取结果api,则不会立即查询数据库,而是等到使用tolist()、count()、

    4.6K30

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

    前言 -为什么需要扩展 Linq 方法 Linq 在 .net 中使用是比较多的,而微软开发的 linq 相关函数无法满足实际项目开发中的需求,我们需要自己来扩展一些方法。...c# 扩展方法 在 Asp.Net Core 开发中或者其他的后端开发中都会有一个需求(尤其对于中台或者后台管理),那就是展示数据列表;当然不是普普通通的数据列表展示,而是需要进行排序、分页、查询关键字来获取列表...if...else 来判断,那么将会是一个非常大的工程量,每个实体上面有 m 个属性,而一个项目中有 n 张表,那么几乎需要 m*n个判断进行处理,非常的差劲,不利于后续扩展和维护。...但是天无绝人之路,在 c#中拥有扩展方法、表达式目录树和反射,可以将上面的方式进行优化。...Expression.Lambda>(propAsObject, x); return expression; } } 实际使用中可以直接使用上方的扩展方法

    2.2K10

    在LINQ to SQL中使用Translate方法以及修改查询用SQL

    但是这种做法有个很常见的问题,那就是可能会获得太多不需要的数据。一个Item数据量最大的是Introduction字段,而显示列表的时候我们是不需要显示它的。...LINQ to SQL在RTM之前的版本有个Bug,如果在查询中显式构造一个实体的话,在某些情况下会得到一系列完全相同的对象。...我们直接来看一个完整的扩展: public static class DataContextExtensions { public static List ExecuteQuery(this...而这次扩展的关键在于新的ExecuteQuery方法,它接受一个IQueryable类型的对象作为参数,返回一个范型的List。...因此我们现在扩展刚才的ExecuteQuery方法,使它接受一个withNoLock参数,表明是否需要为SELECT添加WITH (NOLOCK)选项。

    5.8K50

    规范模式:终结仓储臃肿的终极武器(C#实战)

    一个实体,五个方法,无尽的Include()链。是不是有种维护噩梦似曾相识的感觉?...如果你认为这些额外的仓储重载方法无害,那只是因为你还没有在整个解决方案中搜索过重复的Include(g => g.Creator)。...糟糕透顶 规范模式登场 规范 = 描述查询的对象: • 条件(Expression>) • 包含列表 • 排序 • 额外标志(分页查询、分页...)...通过扩展方法动态组合——使用运算符(&&, ||)组合规范。...关键要点 • 规范模式集中查询逻辑,消除仓储重复 • 评估器将规范转换为IQueryable;仓储只需执行 • 具体规范=人类可读的意图(GatheringByNameSpec) • 扩展分页、缓存或软删除过滤器

    17010

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

    IEnumerable接口 公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。...也就是说:实现了此接口的object,就可以直接使用foreach遍历此object; IQueryable 接口 它继承 IEnumerable 接口,而因为.net版本加入Linq和IQueryable...} Console.WriteLine("OK"); Console.ReadKey(); } 注意红色代码部分,在用linq查询实体集合之前我先将其转换成...第一种:直接返回 IQueryable类型的查询,如下图所示: 第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示: 总结 IQueryable接口与IEnumberable...接口的区别:  IEnumerable 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable 是将Skip ,take 这些方法表达式翻译成

    75850

    解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递。...但是很多时候,我们不需要把整个表的字段都查出来,如果我们直接把整个数据实体查询出来,就极大的影响了性能,所以我们需要通过查询匿名对象或者已经定义的方式,对数据库进行查询; 1.实例使用的数据实体类: public...,可以这样做,让它直接生成CategoryView的列表: var data1 = from c in context.Categoriees select new CategoryView...IQueryable类型,在调用方法处可以直接遍历; 然而,当没有CategoryView的时候,我们就只能使用匿名对象进行查询: var data = from c in...3.目前为止我所知的最好的跨域访问方式 在c#4.0中,加入了dynamic特性,这使得我们可以使用它支持对动态类型的解释,虽然c#语言绝对是静态类型的,但是dynamic通过在编译的时候,不推断出具体类型

    1K30
    领券