IQueryable/IQueryable 和表达式树 IQueryable有两个组件 Expression:当前查询的组件的与语言和数据源无关的表示形式,以表达式树的形式表示。...Provider:LINQ 提供程序的实例,它知道如何将当前查询具体化为一个值或一组值。 在动态查询的上下文中,提供程序通常会保持不变;查询的表达式树将因查询而异。...达式树是不可变的;如果需要不同的表达式树并因此需要不同的查询,则需要将现有表达式树转换为新的表达式树,从而转换为新的 IQueryable。
原本简单的新端点——"通过创建者名称获取聚会并包含参与者、邀请函和创建者"——却在GatheringRepository中膨胀成了又一个新方法。... GetQuery( IQueryable input, Specification spec)...为什么这很酷 优势 说明 单一职责 仓储=协调者;规范=查询定义 可重用性 将小规范组合成更大的规范 可测试性 隔离单元测试规范:提供假IQueryable并断言表达式树 灵活性 分页?添加到基类。...; private set; } protected void ApplyPaging(int skip, int take) => (Skip, Take) = (skip, take); 添加到评估器...关键要点 • 规范模式集中查询逻辑,消除仓储重复 • 评估器将规范转换为IQueryable;仓储只需执行 • 具体规范=人类可读的意图(GatheringByNameSpec) • 扩展分页、缓存或软删除过滤器
IQueryable接口是Linq to Provider的入口,非常有意思的是它并不是一个IQueryable来支撑一次查询。...IQueryable并非IEnumerable对象,无法实时的做出处理然后将结果返回给下一个方法接着执行。那么它如何将片段性的执行方法串成一个整的、完整的查询?...这幅图重点是IQueryable对象的连续操作,大致原理是每次执行扩展方法的时候都会构造一个新的IQueryable,本次的IQueryable对象将包含上次执行的表达式树,以此类推就形成了一颗庞大的表达式树...所以要注意本次的调用将是接着上一次调用,而不是以个新的开始。理解这一点对后面的LINQ分析很关键。 ?...通过上图中,我们大概能分析出IQueryable对象是每次方法的调用都会产生一个新的实例,这个实例接着被下一个方法自然的接受,依次调用。
IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。 IQueryable是一个继承了IEnumerable接口的另一个接口。...Staff"); } Console.ReadKey(); } 在主函数中我们执行建表(只有第一次才需要),删除记录...注意,CreateQuery每次都产生新的表达式对象,不管相同的表达式是否已经存在,这构成了对表达式进行缓存的动机。...supported, {0}", expression.NodeType)); } 现在我们可以运行程序了,当然,结果sql是错误的,我们的解析还没结束,通过设置断点检查表达式的各个变量...CreateQuery每次都产生新的表达式对象,不管相同的表达式是否已经存在,这构成了对表达式进行缓存的动机。
ctx.Articles.Add(a1); await ctx.SaveChangesAsync(); 不需要显式为Comment对象的Article属性赋值(当前赋值也不会出错),也不需要显式地把新创建的Comment类型的对象添加到...IQueryable的复用 IQueryable是一个待查询的逻辑,因此它是可以被重复使用的 IQueryable books = ctx.Books.Where(b => b.Price...AuthorName) select Title, PubTime, Price,{aName} from T_Books where Price > {price}"); 字符串内插 如果赋值给string变量...,就是字符串拼接;字符串内插如果赋值给FormattableString变量,编译器就会构造FormattableString对象。...之前,对IQueryable进行进一步的处理。
如果尝试将 Customer 添加到 List,则会在编译时收到错误。 泛型集合易于使用的原因是不必执行运行时类型转换。...LINQ 查询中的 IEnumerable 变量 LINQ 查询变量被类型化为 IEnumerable 或者派生类型(如 IQueryable)。...看到类型化为 IEnumerable 的查询变量时,这只意味着执行查询时,该查询将生成包含零个或多个 Customer 对象的序列。...var 关键字指示编译器通过查看在 from 子句中指定的数据源来推断查询变量的类型。...customer in customerQuery2) { Console.WriteLine(customer.LastName + ", " + customer.FirstName); } 变量的类型明显或显式指定嵌套泛型类型
我绝对不想 要看到发生的是,从数据库里取回所有的产品记录,将它们放在一个局部的集合里,然后在内存里对它运行Where()扩展方法来进行过滤。这么做效率极其不 高,对大数据库的扩缩性将是极差的。...那样的话,我只返回那些符合查询条件的记录,这样的数据库查询效率是非常高的。...注意上面我是怎么把我们在先前用过的同样的 p=>p.LastName == “Guthrie” Lambda表达式,但这次将其赋值给一个 Expression> 变量...,而不是Func 变量。...IQueryable 接口 为 帮助框架开发人员建立可查询的数据提供器,LINQ提供了 IQueryable 接口。
本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...Collection(集合) Collection是数据记录集合, 编写代码过程中,常常需要合适的容器保存临时数据,方便修改和查找,如何选取合适的数据容器,关键在于将执行的数据操作以及数据记录是否大量。...在内部类中可以定义变量并赋值,接口中不允许此操作。 3. 具体类可包含构造函数,而接口中不能定义构造函数 4. 抽象类中可包含访问修饰符如public,private等,接口中不能包含。 ?...IQueryable与IEnumberable不同的是,当从服务器端加载过量的数据,IQueryable会自动减少应用负载。...IQueryable可保证大数据量时应用程序的高性能。 IQueryable会先过滤数据,然后发送给客户端。 ?
本文主要学习记录以下内容: 建议29、区别LINQ查询中的IEnumerable和IQueryable 建议30、使用LINQ取代集合中的比较器和迭代器 建议31、在LINQ查询中避免不必要的迭代...Queryable类,它针对继承了IQueryable接口的集合类进行扩展。...在LINQ to SQL的查询中,要尽量始终使用IQueryable。...在使用IQueryable和IEnumerable的时候还需要注意一点,IEnumerable查询的逻辑可以直接用我们自己所定义的方法,IQueryable则不能使用自定义的方法...可以发现以上方式实现的排序至少存在两个问题: 1)可扩展性太低,如果存在新的排序要求,就必须实现新的比较器。 2)对代码的侵入性太高,为类型继承了接口,增加了新的 方法。
这种方法随后返回一大堆客户记录。你随后可以决定添加分页支持。你希望将结果捆绑在一个网格中,并对数据排序。最后,决定想要查询的东西,通过比如邮政编码来查询。 ...服务试图比单一应用要获得更长久一些,因此你需要以一种方式设计API,使其能够持久,所以如果你发现你需要添加服务借口的新版本可不太好办,比如创建新的客户端。.../ GET api/Meeting [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] public IQueryable...,可以将结果按Id属性排序,因为按其他属性排序可能会很慢: [Queryable(AllowedOrderByProperties = "Id")] public IQueryable Get(int...Web API OData中利用Queryable API进行验证: http://www.infoq.com/cn/news/2013/02/queryable-api 一个创建 OData 的新选项
延迟执行 IQueryable query = from c in North.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL。...仅仅在需要使用的时候才会执行语句.比如: IQueryable query = from c in North.Customers select c; foreach...主键缓存 Linq to sql对查询过的对象进行缓存,之后的如果只根据主键查询一条记录的话会直接从缓存中读取。...由于没有提交修改,所以数据库中的记录还是没有更新。...由于新的DataContext中还没有获取实体,我们只能通过附加方式更新数据。 首先把Customer表的主键字段加上IsVersion标识: ?
因此,开发人员对于他们必须支持的每种数据源或数据格式,都不得不学习一种新的查询语言。 LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。...下例中,Customers 表示数据库中的特定表,而查询结果的类型 IQueryable 派生自 IEnumerable。...查询存储在查询变量中,并用查询表达式进行初始化。 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。 上一个示例中的查询从整数数组中返回所有偶数。...查询执行 延迟执行 如前所述,查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。...例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。 由于查询变量本身从不保存查询结果,因此可以根据需要随意执行查询。
某些集合类型如果无法通过Count属性/方法确定集合元素数量的话,会严重影响程序性能,这是因为Count属性/方法必须枚举整个集合来确定元素数量,例如EF Core中使用IQueryable.Count...()方法需要访问数据库获取全部记录才能计算总数。...为了解决这个问题我们就需要使用TryGetNonEnumeratedCount方法,如果可以快速计数,该方法将返回true并将计数作为out变量返回。
IRelationalCommandBuilderFactory ,DbCommandLogData 但是Entity Framework Core2.0 在DbContextOptionsBuilder添加了新的扩展方法...也就是为什么我们如果在ASP.NET Core中注入自己的日志记录,也可以通过配置来记录相关的SQL操作的原因. 这里我们主要是直接只监控EF Core的日志....这里作为例子,只将日志记录在了调试窗口..当然也可以记录在自己的文件中..具体请参考LoggerFactory的相关说明.....这个库针对IQueryable进行了动态条件的扩展.....因为它是对IQueryable进行的扩展,所以没有数据库不支持的情况..只要有相关的驱动,就可以基于驱动来生成相关的SQL代码..(我这里访问的就是MySQL) .. 写在最后 就到这里了..
} public abstract void ConfigureDerived(EntityTypeBuilder b); } } 弄完Model和它的配置之后, 就添加到... All { get; } IQueryable AllIncluding(params Expression>[] includeProperties... All => Context.Set(); public virtual IQueryable AllIncluding(params Expression>[] includeProperties) { IQueryable query = Context.Set();..."Anonymous"; #endregion } } 由于父类构造函数依赖的类太多了, 所以我建立了一个CoreService, 里面包含着这些依赖, 然后用一个变量就注入进去了
在上面的一系列新特性的支持下,微软通过大面积的构建扩展方法使得上述特性能连贯的互相作用,形成自然的集成查询框架。...其实这是构建与CTS之上的一种由编辑器负责处理的新的查询语法,它不是C#也不是VB.NET之类的托管语言。...关于链式查询方法也是一个对象设计问题,我们参见链式设计模式可以很自然的构建符合我们自己实际需求的链式查询方法,这一系列的查询方法的添加存在一个很大的问题就是无法动态的添加到要扩展的对象内部去。...2.4.深入IQueryable、IQueryable、Queryable(LINQ to Provider框架的入口) IQueryable接口是提供给我们来实现自定义数据源用的,为了支持强类型的数据源集合我们直接使用...IQueryable接口,当我们使用LINQ来查询IQueryable接口时查询表达式会被直接编译成对应的Queryable静态类中的对应的静态扩展方法。
Console.WriteLine(objStudent.StudentName); } //使用where方法查询符合条件的数据 IQueryable...对象存在,但没有被跟踪 新创建的对象 Unchanged 对象尚未经过修改 从DbContext中读取的对象,使用Attach()方法添加的对象 ,执行SaveChanges()后的对象 Added 对象为新对象...,并且已添加到对象上下文 使用Add()方法添加的对象 Deleted 对象已从上下文中删除 使用Remove方法溢出的对象 Modified 对象上的一个属性已更改 受DbContext管理,并修改属性的对象...Console.WriteLine(efdb.Entry(objStudents).State.ToString()); Console.ReadKey(); 通过三个输出语句记录了对象从创建开始...,到添加到上下文,到保存的过程,大家先不用关注代码的意思,主要看下状态的变化。
public static IQueryable Take(this IQueryable source!!...的一个类型,最终自定义的实现的这个Queryable,里面的Expression就存储着我们组装的所有的表达式,相当于每次我们调用Queryable的方法的时候都会构建一个新的EntityQueryable...最终调用结束在List的构造函数里去创建一个新的List,GetEnumerable返回了我们本次的查询结果。...然后循环添加,这里只是一个简单的例子,感兴趣的朋友,可以自己去进行扩展,在AddRange,还有UpdateRange等批量操作的都会进去到这里,commandBatches是我们所有需要进行批量操作的记录...调用GetOriCreateEntry方法,然后TryGetEntry判断实体在不在上下文,在下面折叠的代码看到,内部是维护了一个五个字典类型的变量,分别对于detached,add,delete,modified
这些文件允许你指定各种环境变量及其相应的值。 在大多数情况下,你不希望将 .env 文件添加到源代码控制中(即Git)。...因此,应该将它的文件名添加到 .gitignore 文件中,以确保在以后的提交中都被排除在外。...现在有了一个带有我们想要使用的变量的 .env 文件。但是应该如何将该变量加载到我们的代码中呢? 最简单的方法是使用名为 dotenv 的 npm 模块。它将为我们完成所有繁重的工作。...你可以使用以下命令中的任何一个来安装它: # Npm npm install dotenv --save # Yarn yarn add dotenv 成功安装 npm 软件包后,将以下两行添加到入口文件的顶部...你可以通过在 .env 文件中记录变量来测试它: // Node.js console.log(process.env.PASSWORD) //"12345" 运行代码时,应该能够在命令行输出中看到变量的值
这些文件允许你指定各种环境变量及其相应的值。 在大多数情况下,你不希望将 .env 文件添加到源代码控制中(即Git)。...因此,应该将它的文件名添加到 .gitignore 文件中,以确保在以后的提交中都被排除在外。...现在有了一个带有我们想要使用的变量的 .env 文件。但是应该如何将该变量加载到我们的代码中呢?...你可以使用以下命令中的任何一个来安装它: # Npm npm install dotenv --save # Yarn yarn add dotenv 成功安装 npm 软件包后,将以下两行添加到入口文件的顶部...你可以通过在 .env 文件中记录变量来测试它: // Node.js console.log(process.env.PASSWORD) //"12345" 运行代码时,应该能够在命令行输出中看到变量的值