2、三个文件的代码(命名空间) IRepository.cs代码: using System; using System.Collections.Generic; using System.Linq;...using System.Linq.Expressions; namespace EnterpriseFrame.Core.Data { /// /// 这里T是泛型...where T : class { /// /// Gets a table /// IQueryable.../// /// /// IQueryable... /// /// public IQueryable
开始前我们先看一个问题: 你是否曾经在学习 Mybatis 的时候跟我有一样的疑问,什么情况下返回 null,什么时候是空集合,为什么会是这种结果?那么你觉得上述这种回答能说服你嘛?...看完这篇你就知道查询结果为空时候为什么集合会是空集合而不是 NULL,而对象为什么会是 NULL 了。 PS:对过程不感兴趣的可以直接跳到最后看结论。...我们可以看到 DefaultSqlSession#selectOne() 方法,我们先说结论:因为只有一个 ResultSet 结果集,那么返回值为 null。...} | 返回结果为多行数据 那么我们看到 DefaultSqlSession#selectList() 方法,先说结论:返回值为空集合而不是 NULL。...所以不管是集合类型还是普通对象,Mybatis 都会先初始化一个 List 存储结果,然后返回值为普通对象且查为空的时候,selectOne 会判断然后直接返回 NULL 值。
本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...System.Collections.ArrayList strArrayList = new System.Collections.ArrayList(); //System.Linq.IQueryable...当数据为通用类型,List是强类型,List中元素类型不需要等到运行时来确定,这种特性使得List 运行时效率非常高。 3. 可使用Foreach关键字。...IQueryable可保证大数据量时应用程序的高性能。 IQueryable会先过滤数据,然后发送给客户端。 ?...18: 19: IQueryable queryIQueryable=null; 20: 21: //Bring
IQueryable不存储数据,它存储的是"配方" 这可能是最关键也最容易被误解的概念。当你针对数据库编写LINQ查询时,通常操作的是IQueryable。...只有当你调用ToList()、First()或Count()等物化方法时,LINQ提供程序(如Entity Framework)才会将整个"配方"转换为优化后的SQL查询并发送到数据库。...这就是为什么在IQueryable查询中使用本地C#方法会失败——SQL转换器根本不知道你的C#方法要做什么。...你可以(也应该)编写自己的LINQ操作符 LINQ不是封闭的黑盒,而是完全可扩展的框架。你只需为IEnumerable创建扩展方法,就能添加自定义操作符。...count = ; } // 返回最后一个可能未填满的桶 if (bucket !
公司的框架中Cache实现文件: (1)CacheUtil.cs using System.Collections.Generic; using System.Linq; using Modules;...= null; } } /// /// 获取有权限的菜单 /// private...using (var context = new MyDbContext()) { IQueryable menus = context.Menus...var context = new MyDbContext()) { IQueryable funcs = context.Funcs... GetForbiddenFuncs() { return LoginUser == null ?
Dequeue方法根据head索引返回当前元素,之后将head索引指向null,再递增head 的值。 实现队列的方式和实现栈的方式大同小异。..., remove, insert等功能 提供转换为IQueryable方法 LinkedList 没有索引,通过Find方法 ICollection 内部使用链表实现的列表 不继承自...替代作为返回类型 IQueryable 通过IndexOf IEnumerable 从远端获得筛选之后的资料,和IEnumerable不同,IQueryable返回所有资料然后才进行筛选...方法GetEnumerator返回一个IEnumerator类型的输出。...IEnumerable是整个LINQ的基础。整个LINQ都基于IEnumerable的扩展方法之上。C#大部分数据结构都实现了IEnumerable。
如果一定要动态改变数组的长度,一种方法是将数组转换为ArrayList或List<T>,需要扩容时,内部数组将自动翻倍扩容 还有一种方法是用数组的复制功能。...}; 重点:初始化设定项绝不仅仅是为了对象和集合初始化的方便,它更重要的作用是为LINQ查询中的匿名类型进行属性的初始化。...如果将属性设置为可写,则会增加抛出异常的几率。一般情况下,如果集合属性没有值,则它返回的Count等于0,而不是集合属性的值为null。...13.区别LINQ查询中的IEnumerable<T>和IQueryable<T># LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了...稍加观察我们会发现,接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,所以,致使这两个接口的方法在很大程度上是一致的。那么,微软为什么要设计出两套扩展方法呢?
接口中从IEnumerable继承下来的两个返回IEnumerator接口类型的方法,在我们目前使用的Linq to Sql、Linq to Entity中都会返回强类型的集合对象,一般都不会实时的进行数据查询操作...这是问题的重点,对扩展方法、链式编程不熟悉的朋友很难将source能串联到之前方法所返回的IQueryable对象上。...但是IQueryable却跟我们开了一个玩笑,它的调用到最后的返回不知道执行多少了CreateQuery了。...方法的返回类型也是IQueryable类型,返回类型和扩展类型相同就已经构成链式编程的最小环路。...面向接口的设计追求职责分离,这里为什么把执行和创建IQueryable都放到IQueryProvider中去?
前言 -为什么需要扩展 Linq 方法 Linq 在 .net 中使用是比较多的,而微软开发的 linq 相关函数无法满足实际项目开发中的需求,我们需要自己来扩展一些方法。...// 使用 property.Type 会在最后转换时出现错误 var propAsObject = Expression.Convert(property, typeof(object...= null && coditionEntity.SearchKeyValue.Enable && !..., IQueryable>(query, resultQuery); } } 这样通过 linq 就可以直接调用 UseCoditionFind 然后获取返回的 query,然后再...ToList 获取数据,返回即可。
为什么要学习表达式树?表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。...LabelExpression returnLabel = Expression.Label(returnTarget,Expression.Constant(10,typeof(Int32))); // 为输入参加...实际上Expression类为我们提供了一系列的工厂方法来帮助我们创建表达式,就像我们上面用到的Constant, Parameter, SwitchCase等等。...我将上面链接中的代码转换成下面的表格方便大家查阅。 ? 认识了ExpressionVisitor之后,下面我们就来一步一步的看看到底是如果通过它来访问我们的表达式树的。.../b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx
LINQ to SQL可以将查询表达式转换为SQL语句,然后在数据库中执行。相比LINQ to Object,则是将查询表达式直接转化为Enumerable的一系列方法,最终在C#内部执行。...将查询表达式转换为SQL语句并不保证一定可以成功。 IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。...它令IQueryable和IEnumerable一样,拥有强大的查询能力。 AsQueryable方法将IEnumerable转换为IQueryable。...在LINQ to SQL中lambda表达式首先被转化为表达式树,然后再转换为SQL语句。 我们试图实现一个可以将where这个lambda表达式翻译为SQL语句的查询提供器。...我们的目标是解析where表达式,将其转换为SQL,然后调用ExecuteSql方法返回数据,和通过直接调用where进行比较。
方法 T4模版的使用 1.改变EF代码生成策略旧的ObjectContext改为T4(如果你的项目已经是DBContext API模式请跳过)(操作前备份项目) 在此之前我们也该改变一下代码生成策略,为什么会这个改变...来看代码才明白 在第一节下载17 讲代码 我们来看现有代码,以SysSample 模块的IDAL和DAL为例子 using Apps.Models; using System.Linq; namespace...是可变的 1.接下来我们实现通用接口在IDAL层 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions...schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; private readonly System.Collections.IList...MetadataTools _ef; public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList
大家好,又见面了,我是全栈君 废话不说只有代码: 1 using System.Linq; 2 using System.Collections.Generic; 3 4 namespace...//http://www.cnblogs.com/roucheng/ 29 #region Constructors 30 31 public PagedList(IQueryable... source, int pageIndex, int pageSize) 32 { 33 if (source == null || source.Count...source.Skip(pageIndex * pageSize).Take(pageSize).ToList()); 46 } 47 48 public PagedList(IList... source, int pageIndex, int pageSize) 49 { 50 if (source == null || source.Count
其实可以的,有个很隐蔽的窍门隐藏在IQueryable扩展方法对象Queryable中,也就是AsQueryable方法,它返回的是一个实现了IQueryable接口的EnumerableQuery...IEnumerable对象需要能够被转换成IQueryable对象。...为什么需要动态LINQ查询,上面说过问题出在我们没办法在运行时再去编写Lambda表达式了,都知道Lambda表达式到最后就是被编译成Expression表达式树对象,所以我们可以在运行时自己动态的构建...以往我们很难在运行时为对象动态的添加属性、行为、事件,通过动态语言运行时我们可以很自如的添加想要的东西。...后面我们就来详细的讲解如何扩展IQueryable、IQueryableProvider两个重量级接口,只有他们两个才能让我们和LINQ对话,这两个接口还是很神秘的。
可查询类型无需额外操作即可进行LINQ操作,若数据源在内存中不以可查询类型的形式存在,那么LINQ提供程序必须要先将数据源转换为可查询类型,如LINQ to XML将XML文件转换为可查询的XElement...LINQ查询特点: 延迟查询 若查询表达式的返回结果是IEnumerable类型,则在声明查询表达式时不会执行查询,而是在迭代查询变量时才进行查询。...立即查询 若查询表达式返回单个值或者使用了ToList、ToArray等方法时会执行立即查询,因为这些操作会遍历数据。...两个接口 在LINQ中,一个查询表达式被编译为表达式树或者委托,查询结果为IEnumerable类型则被编译为委托,查询结果是IQueryable或IQueryable类型则被编译为表达式树...,在运行时表达式树会被解析为适合于数据源的查询语句。
在学习完表达式树的创建和遍历之后,我们要利用它的特性来写一个我们自己的Linq Provider。人家都有Linq to Amazon为什么我们不能有Linq to cnblogs呢?...主要思路是这样的: 为文章建立实体类(Post) 将博客园Service返回的数据解析成Post的集合,我们可以加上自己的缓存机制,可以采用1分钟才到博客园取一次数据 把我们上面创建的post集合当作数据库...XML数据转换成我们要的post集合,所以我们要用到Linq to XML。...为什么要通过Url来查询?因为我们最后会通过我们自己的LinqProvider将Linq查询语句直接翻译成Url这样就能够实现远程的返回数据了。来看看我们对Url参数的定义: ?...可以在运行时去遍历解释然后执行,那么这样就可以将表达式转换成各种其它的方式去获取数据,伟大的Linq to SQL就是这么实现的。
我们会发现接口IQueryable实际也是继承了IEnumerable接口的,既然这样微软为什么要设计出两套扩展方法呢?...针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的是Expression。 那么,到底什么时候使用IQueryable,什么时候使用IEnumerable?...in orders) { Console.WriteLine("OrderId:" + order.OrderID); } } 通过vs的Intellisense我们可以看到Where的返回类型为...的查询返回IEnumerable类型,我们看一下vs的Intellisense效果: ?...由于我们在LINQ查询的时候加上了AsEnumerable(),因此我们在第二条语句能看到返回类型已经变为IEnumerable,参数也变成了Func类型。
C#语音播报 .Net里面自带了一个语音类库:System.Speech,调用系统的语音功能,就能实现string到语音的转换: using System.Speech.Synthesis; var..."); 中文需要操作系统语言包支持 C#DateTime C#中对于DateTime==null,这个值永远为假命题,因为DateTime永远有值,其默认值为0001-01-01,所以和其做逻辑与&&操作的表达式永远执行不到...传进去Func那么返回值是IEnumable的接口类型的集合,如果是Expression>那么返回的是IQueryable类型的接口集合。...而IQueryable接口类型的集合是支持延迟加载和自动根据条件生成sql的。...IQueryable才是问题的关键,它也成就了Linq to anything 关于Emit var il = dynamicMethod.GetILGenerator();//获取中间语言生成器
三..NET3.5的扩展方法Enumerable和Queryable: 在框架中,扩展方法最大的用途就是为LINQ服务,框架提供了辅助的扩展方法,位于System.Linq命名空间下的Enumerable...{ /// /// 获取与 Linq.IQueryable"/> 的实例关联的表达式目录树。.../// /// /// /// 与 Linq.IQueryable"/> 的此实例关联的 Expression Expression { get; } /// /// 获取在执行与 Linq.IQueryable..."/> 的此实例关联的表达式目录树时返回的元素的类型。
font-family:FangSong_GB2312;font-size:18px;">using System; using System.Collections.Generic; using System.Linq.../// /// 获取所有集合 /// /// 集合 //IQueryable.../param> /// 每页大小 /// 集合 //IQueryable...font-size:18px;">using System; using System.Collections.Generic; using System.Linq...; using System.Text; using Spring.Data.NHibernate.Generic.Support; using NHibernate; using System.Linq.Expressions