这是一篇我在2012年写的老文章,至今适用(没错,我说的就是适用于EF Core)。因此使用微信重新推送,希望能帮到大家。 自从我用了EF,每次都很关心是否有潜在的性能问题。...在公司码程序的时候,我看到好多同事用EF,写完查询喜欢直接调用ToList()方法。有时候这会造成很大的性能问题。...如果你只是想根据条件选择其中一些数据,而非全部的话,那ToList()以后再筛选,就是从内存里执行了,并不是把你的条件转换成sql的where语句去执行。...IQueryable, IEnumerable 在这两个接口的选择上,我偏向使用IQueryable。...所以文章一开始我就建议大家多用SQL Profiler看看自己的LINQ是怎么执行的。 如果把返回类型换成IQueryable,那么你的where语句就可以转化为SQL执行。
to SQL或其他LINQ提供程序的实现. 2> Michael Stum..: 有一些"黑客"涉及使用3.5 Framework中的System.Core.dll使其与.net 2.0一起运行,但我个人不希望使用这样一个有点摇摇欲坠的基础...Downey..: 理论上是的,只要您分发LINQ特定程序集和任何依赖项.但这违反了微软的许可.Scott Hanselman写了一篇关于在ASP.NET 2.0上部署ASP.NET MVC的博客文章,这与您想要做的类似...扩展和几个委托声明(中Action和Func家庭),并已在实施LINQBridge(如mausch提到).LINQ to XML和LINQ to DataSets依赖于LINQ to Objects,我想也可以为....Net 2.0实现,但我还没有看到这样做.... end function 表达式树版本使您能够获得提供给子句的表达式的树表示,然后可以使用它们来生成SQL代码(或者您想要的任何其他内容).
,前者是Repository基础契约定义,后者是该契约基于EF的实现。...泛型IRepository接口用来规范所有仓储都应该具有的基础增删查改方法,这里有2点需要注意: 1)方法返回类型为IQueryable,目的是延迟查询,用过类似EF的ORM的应该都知道; 2)接口有个泛型参数...注意最后边的那个save,有些实践中会把save直接整到UoW里边去,我没有,因为我对UoW的唯一期望就是,管理好事务,不涉及到事务的情况下,应用服务层连UoW的影子都不要出现,有Repository就够了...大家注意,这里既然这里抽象出了Account.Infrustructure.Contract,以及有了Account.Infrustructure.EF的实现,以及我上边说了那么多各ORM关于save的不同...,你就应该想到,抽象的目的,是为了切换ORM准备的,假如我想切换为Chloe的实现,那么很简单,改动只需要3处: 1)startup中EFDBContext的注册改为Chole Context的注册,如
当你搞懂了原理之后,我想每个人都能想出来各种不同的应用方向,那么技术发展才有意义,当然这也是最难能可贵的。...2.2】.通过继承IEnumerable接口 我想大部分的情况下我们都是直接使用IEnumerable的实现类,但是在编写系统组件、框架的时候一般都是要自己去实现自己的迭代器类的。...3.3】.分段执行IQueryable中的子方法(Queryable中的扩展方法) 都知道Linq的查询是将一些关键字拼接起来的,行成连续的查询语义,这其中背后的原理文章上上下下也说过很多遍,我想也应该大致的了解了...看似一次执行却隐藏着多次方法调用,后台暗暗的构建了我们都不知道的执行模型,让人欣喜若狂。我们来揭开IQueryable在链式方法中到底是如何处理的,看看它到底藏的有多深。...如果把创建IQueryable提取处理形成独立的创建接口我觉得更巧妙,当然这只是我的猜测,也许是理解错了。
前言 通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口。这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方。 ? 1....这是我个人习惯,实际上并没有其他影响。主要是为了对实现类隐藏具体的EF 上下文实现类。...,这样有一个好处,小伙伴们可以想一下哈。...当然了,这是我自己觉得这样会好一点。... CreateOrderExpression(this IQueryable source, string orderBy, string orderAsc) {
前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多。...这个项目我最初开始创建的时候用的EF版本为EF4.0当时EF4.0只提供了ObjectContext API接口模式 这个访问方式只能对于DataBase Frist用,不能用于Code Frist.所以一直用到这里...配置第五行的inputFile为上面所描述,可能因为环境不同你们EF路径有所不同。保存后TT模版会自动生成 tt模版如果没有高亮显示的。要安装一些工具。因为我是一边改一边发文章的。..., "ef"); _code = code; _typeMapper = typeMapper; _ef = ef; } public...最后我完全修改了我项目的DAL层。用数据直接说话 ? ? 整整少了两万行。却完成了相同的功能。(代码类型.cs,与事实可能有点差别,但是可以效果明显) 代码参考下载。
看起来这条语句并没有什么实际意义,然而这是AutoMapper生成的sql,同时我也表示不理解为什么和EF生成的不同) 这样做的好处? 避免在循环中访问导航属性多次执行sql语句。...不错不错,正是我们想要的效果。如果你不想用ThenBy,且都是升序的话,我们也可以: ? ? 生成的sql是一样的。...和我们想要的效果完全符合,是不是感觉美美哒!!...(我想,不止被我一个人用坏了吧。) 我们看到上面的Any干嘛的?官方解释是: ? 我反复阅读这个中文解释,一直无法理解。...扩展方法 最后整理下自定义的IQueryable的扩展。
有人说EF没有必要套一个Repository,我是同意的。但是不同的场景,不同的使用方法,我们下面再具体讲。...我的答案是肯定的,这个和我们为Repository建立接口是一样的,EF中的IDbSet就是一个Repository模式,但是他们都是EF里面的东西,如果哪天我们换成NHibernate了,我们不可能为了这一个接口和基类把...我想这个问题@田园的蟋蟀纠结过很久:) ,也就是领域服务那里面持有repository的引用,它可以自己将要更新的实体添加到repository中,但是如果对于一些不涉及到领域服务的操作,那这一点就需要在应用层来做了...Table作为IQueryable返回,那我们想怎么查就随意了。因为是IQueryable,所以也是只会返回我们所查询的内容,和直接用EF查询是一个道理。...当然有人也许会建议直接拿EF来用多好,其实我不建议这样去做,考虑到以后把EF换掉的可能性。并且我们加这样一个接口真的不会碍着我们什么事。
方法的委托,在下面的Finder里面可以看到最终是调用了GenericCreate的方法创建一个方法委托,然后去调用,而这个抽象方法的实现是在ClrPropertySetterFactory里面,最终是创建了一个...Action的委托传入到ClrPropertySetter里面去了,这样就创建了DBContext里面的所有的DbSet的Set方法,,但是呢这里是只给构建了DBSet的Set方法,但是还没有调用,相当于此时的...public static IQueryable Take(this IQueryable source!!...是在DataBase抽象类下的,还记得我们需要在EF执行的时候打印Sql语句需要UseLogger吗,我没记错的话,日志是在这个构建里面去开始触发写Sql的事件的,这里的Logger,再看下去,就会看到...EventId,EventData,包括了执行的类型,数据语句都可以获取的到,在往下面走,就是表达式的遍历,以及不同数据库的需要做不同的处理,这里很多我没细看,感兴趣的可以自己去看看。
本篇博客我主要想讲如何使用 asp.net mvc + EF + spring.net 搭建一个简单的项目框架,我也并不是对前前后后所有的内容都理解,有的地方是囫囵吞枣,水平太菜,见谅。...(2)在Model层中新建类库 Model,然后添加EF数据库实体 添加实体的操作我就不啰嗦了,我以前的博客有讲到。结果如下: ?...目前,我们使用的是单一的EF操作数据库,所以实例化的就是EF的上下文,但是,操作数据的方式不止EF这一种,如果有一天我们的项目突然要求要用NH(另一种操作数据库的方式,但我没学过)操作数据库,那么如果我们像这样写的话...但是,如果有一天,我的Dal要由EF写的UserDal换为NH写的NHUserDal,那可怎么整呢,我难道要在每个用到UserDal的文件里分别去把new UserDal() 换为 new NHUserDal...假设我现在有两种方式操作数据库,EF和NH,一种操作数据库的方法写在项目EFDal下,另一种写在NHDal项目下,然后让两个项目下各个操作方法的名字保持一致。
为什么需要动态SQL 在使用 EF或者写 SQL语句时,查询条件往往是这样一种非常常见的逻辑:如果客户填了查询信息,则查询该条件;如果客户没填,则返回所有数据。...我常常看到很多人解决这类问题时使用了错误的静态 SQL的解决办法,使得数据库无法利用索引,导致性能急剧下降。 介绍数据 这次我将使用我的某客户的真实数据来演示(已确认不涉及信息安全?)...我在 Id、 FoodMenuId、 OrderUserId上创建了非聚集索引,在 OrderTime上创建了聚集索引。该表有 51652条数据。...如果是 EF,代码可能是这个样子: IQueryable query = db.FoodOrders; if (userId !...就像文中所说的动态 SQL,我认为理解数据库、对写出高性能的应用程序至关重要——这显而易见,但其实又很容易忽略。
大家好,又见面了,我是你们的朋友全栈君。...1.在VS中新建控制台应用程序 2.右击刚刚建好的程序,添加“ADO.NET实体数据模型” 3.选择“来自数据库的EF设计器” 4.依次连接服务器和数据库 5.选择包括敏感数据 6.选择实体框架...这样database first的实现已经基本上完成了,如果想要用ModelFirst的方式,在第3步选择”空EF设计器模型“,在edmx文件中自己添加数据表即可。接下来通过代码来实现对数据库的操作。...#endregion #region 查询 linq语句 //linq表达式:IQuerable类型 IQueryable
,在DBContext中将拦截器添加进去,在每次执行查询或者增加删除修改的时候,都会进入这个拦截器,从而实现自己想要的业务逻辑,我在此处是写了一个简单的读写分离,感兴趣的可以看看之前的文章https:/...的核心在于表达式树,可以说表达式树构造了整个EF的核心,关于表达式树,我在我的第一篇博客就写了很多关于表达式树的案例,https://www.cnblogs.com/1996-Chinese-Chen/...p/14987967.html,感兴趣的朋友可以看看,所以此处表达式树我不会做讲解,只有如何实现自定义的表达式树拦截, 重要的有三个我们需要实现的接口,一个是IQueryable,IQueryCompiler...optionsBuilder.ReplaceService(); #接管IOC 缓存查询方法 在上面的代码中,我们可以看到我们调用了一个ComileQuery方法,构建了一个委托...数据库是我破解的我本地的微信数据的一部分,emmm作为了本次的例子,我希望大家能够合理看待我的这个数据库的数据,不要做一些不好的事情,谢谢大家。
,不会用到太多复杂的LINQ语句 注意:本节以及以后的数据库示例,我想会放到文章最后,有兴趣的朋友可以直接下载,如果您有sql 2000/2005的示例数据库,就不需要啦 找到northwind(下载)..._City = value; } } } 好了,我们已经创建了一个类与一个Customers表进行映射,接来下就是LINQ to SQL中最最最重要的一个类出场啦DataContext...Table customers = dc.GetTable(); dc.Log = Console.Out; IQueryable...{ Console.WriteLine(c.CustomerID+" | "+c.Orders.Count); } 这样的代码,还并不是我们想要的...c.CustomerID + " | " + c.City); } Console.ReadKey(); 这里我们使用了匿名类型var,在这里,其实它是一个实现了IQueryable
virtual ListModel> GetList(ref GridPager pager, string queryStr) { IQueryable...我在处理 entity.Name = model.Name;时候我想entity.Name = model.Name.TrimStart() 去掉字符串前面的空格,那么可以看到根本无法操作。...必须用一张图来看,我是这么做的 ? 绿色是我们已经重构完成的。...virtual ListModel> GetList(ref GridPager pager, string queryStr) { IQueryable...Apps.BLL { public partial class SysSampleBLL: Virtual_SysSampleBLL,ISysSampleBLL { } } 好吧,我只是想省掉写
我们将参数命名为p是不相干的,我也可以很容易地将其命名为o,x,foo,或者我想要的任何名字。...但考虑一下你想要查询数据库里的数据的情形(下面的代码是使用Orcas中内置的LINQ到SQL对象关系映射器写成的) : ?...编译器不会产生IL,而是会指派一个表达式树对象,然后我作为一个框架开发人员就可以用它来对相应的Lambda表达式进行分析,按我想要的方式对其进行运算(譬如,我可以挑出表达式中的类型,名字和值等)。...IQueryable 接口 为 帮助框架开发人员建立可查询的数据提供器,LINQ提供了 IQueryable 接口。...想阅读一些关于如何使用 IQueryable 来建立自定义的LINQ数据提供器的精彩博客系列的话,请看一下下面这些别人写的精彩博客贴子: LINQ to Amazon: Part 1, Part
环路执行对象模型、碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频频出现这样的模型,这些模型帮助我理解...那么在LINQ中来说,我们无法通过一个方法多次调用来产生我们想要的表达式树,一个Where查询表达式扩展方法可能不仅仅是被LINQ查询表达式所使用,还有可能被ORM的入口方法所使用,比如Update更新的时候就需要...下面我用一个简单的例子再附上一些简单的图示来跟大家分享一下这几个模式语言的关系。...这一节我将给出LINQ的核心的执行图,我们将很清楚的看见LINQ的最终表达式树的对象结构,它是如何构建一棵完整的树形结构的,IQueryable接口是怎么和IQueryProvider接口配合的,为什么...既然已经结束了LINQ的全部分析,那么我们动手写一个小例子,作为想扩展LINQ的小雏形。
,只是简单的调用DbContext(EF中的数据上下文)这种东西。...那为什么我不能直接调用DbContext呢?是的,这样的疑问相信不止很多同学都遇到了。所以在微软EF Core 3.x的官方教程中,提到了这样的一句话: ?...通过返回一个IQueryable对象,甚至可以将业务查询逻辑直接放到应用层,这样想怎么操作就怎么操作。 请注意!!!这非常的危险!!!! 您可能会问了:“我平时所接触的框架或者仓储不都是这样写的吗?...可以实现我任何的业务查询,爽歪歪。” 但是这样写正在逐渐丧失存储库原有的作用。回到开篇提到的一个问题:假如使用了EF这样的ORM框架,为什么还需要嵌套一层仓储呢?...要么就是将存储库的规则打破,直接查询利用EF Core查询出IQueryable集合对象,然后一顿输出猛如虎来达到效果。
在上一篇中,我们用代码的方式创建了一个没有返回值,用到了循环以及条件判断的表达式,为了加深大家对表达式树的理解,我们先回顾一下,看一个有返回值的例子。...而第三种我们是利用了goto 语句,如果我们在表达式中想跳出循环,或者提前退出方法它就派上用场了。这们上一篇中也有讲到Expression.Return的用法。...,可有人说表达式不好理解,恐怕我就没有办法认同了。...看到很多园友说表达式树难以理解,我也希望能够尽我的努力去把它清楚的表达出来,让大家一起学习,如果大家觉得哪里不清楚,或者说我表述的方式不好理解,也欢迎大家踊跃的提出来,后面我们可以继续完善这个翻译SQL...之间想整个Linq to 博客园,但是好像博客园没有公开Service。 点这里面下载文中源代码。
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO EF...model.CreateTime) } 有看过前面的童鞋,应该很熟悉这一步很机械化的创建了...创建数据表 更新到EF 创建BLL和DAL层 创建Model 创建爱你Controller 创建View 注入到容器 运行 你看了不累我都觉得累了,我们以后会讲用T4,我们自动生成 预览下效果,你会发现我们的左边的菜单栏可以点出来了...反正我是要捕获到这异常了...、 我们一般先对数据进行判断避免捕获异常,因为try catch会降低程序的性能,我们一般在业务层捕获异常,处理逻辑容易导致异常 处理异常出错,我们将输出文本格式,来记录异常...ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO SET ANSI_PADDING OFF GO EF