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

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

原本简单的新端点——"通过创建者名称获取聚会并包含参与者、邀请函和创建者"——却在GatheringRepository中膨胀成了又一个新方法。... GetQuery( IQueryable input, Specification spec)...为什么这很酷 优势 说明 单一职责 仓储=协调者;规范=查询定义 可重用性 将小规范组合成更大的规范 可测试性 隔离单元测试规范:提供假IQueryable并断言表达式树 灵活性 分页?添加到基类。...; private set; } protected void ApplyPaging(int skip, int take) => (Skip, Take) = (skip, take); 添加到评估器...关键要点 • 规范模式集中查询逻辑,消除仓储重复 • 评估器将规范转换为IQueryable;仓储只需执行 • 具体规范=人类可读的意图(GatheringByNameSpec) • 扩展分页、缓存或软删除过滤器

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

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

    IQueryable接口是Linq to Provider的入口,非常有意思的是它并不是一个IQueryable来支撑一次查询。...IQueryable并非IEnumerable对象,无法实时的做出处理然后将结果返回给下一个方法接着执行。那么它如何将片段性的执行方法串成一个整的、完整的查询?...这幅图重点是IQueryable对象的连续操作,大致原理是每次执行扩展方法的时候都会构造一个新的IQueryable,本次的IQueryable对象将包含上次执行的表达式树,以此类推就形成了一颗庞大的表达式树...所以要注意本次的调用将是接着上一次调用,而不是以个新的开始。理解这一点对后面的LINQ分析很关键。 ?...通过上图中,我们大概能分析出IQueryable对象是每次方法的调用都会产生一个新的实例,这个实例接着被下一个方法自然的接受,依次调用。

    2.1K11

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

    IQueryable 理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。 IQueryable是一个继承了IEnumerable接口的另一个接口。...Staff"); } Console.ReadKey(); } 在主函数中我们执行建表(只有第一次才需要),删除记录...注意,CreateQuery每次都产生新的表达式对象,不管相同的表达式是否已经存在,这构成了对表达式进行缓存的动机。...supported, {0}", expression.NodeType)); } 现在我们可以运行程序了,当然,结果sql是错误的,我们的解析还没结束,通过设置断点检查表达式的各个变量...CreateQuery每次都产生新的表达式对象,不管相同的表达式是否已经存在,这构成了对表达式进行缓存的动机。

    2.2K10

    最全数据结构详述: List VS IEnumerable VS IQueryable VS ICollection VS IDictionary

    本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, Dictionary, IQueryable...Collection(集合) Collection是数据记录集合, 编写代码过程中,常常需要合适的容器保存临时数据,方便修改和查找,如何选取合适的数据容器,关键在于将执行的数据操作以及数据记录是否大量。...在内部类中可以定义变量并赋值,接口中不允许此操作。 3. 具体类可包含构造函数,而接口中不能定义构造函数 4. 抽象类中可包含访问修饰符如public,private等,接口中不能包含。 ?...IQueryable与IEnumberable不同的是,当从服务器端加载过量的数据,IQueryable会自动减少应用负载。...IQueryable可保证大数据量时应用程序的高性能。 IQueryable会先过滤数据,然后发送给客户端。 ?

    2.3K80

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

    本文主要学习记录以下内容:   建议29、区别LINQ查询中的IEnumerable和IQueryable   建议30、使用LINQ取代集合中的比较器和迭代器   建议31、在LINQ查询中避免不必要的迭代...Queryable类,它针对继承了IQueryable接口的集合类进行扩展。...在LINQ to SQL的查询中,要尽量始终使用IQueryable。...在使用IQueryable和IEnumerable的时候还需要注意一点,IEnumerable查询的逻辑可以直接用我们自己所定义的方法,IQueryable则不能使用自定义的方法...可以发现以上方式实现的排序至少存在两个问题: 1)可扩展性太低,如果存在新的排序要求,就必须实现新的比较器。 2)对代码的侵入性太高,为类型继承了接口,增加了新的 方法。

    1.5K50

    ASP.NET Web API对OData的支持

    这种方法随后返回一大堆客户记录。你随后可以决定添加分页支持。你希望将结果捆绑在一个网格中,并对数据排序。最后,决定想要查询的东西,通过比如邮政编码来查询。   ...服务试图比单一应用要获得更长久一些,因此你需要以一种方式设计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 的新选项

    3.4K50

    C#3.0新增功能09 LINQ 基础02 LINQ 查询简介

    因此,开发人员对于他们必须支持的每种数据源或数据格式,都不得不学习一种新的查询语言。 LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。...下例中,Customers 表示数据库中的特定表,而查询结果的类型 IQueryable 派生自 IEnumerable。...查询存储在查询变量中,并用查询表达式进行初始化。 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。 上一个示例中的查询从整数数组中返回所有偶数。...查询执行 延迟执行 如前所述,查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。...例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。 由于查询变量本身从不保存查询结果,因此可以根据需要随意执行查询。

    4.8K30

    浅析Entity Framework Core2.0的日志记录与动态查询条件

    IRelationalCommandBuilderFactory ,DbCommandLogData 但是Entity Framework Core2.0 在DbContextOptionsBuilder添加了新的扩展方法...也就是为什么我们如果在ASP.NET Core中注入自己的日志记录,也可以通过配置来记录相关的SQL操作的原因. 这里我们主要是直接只监控EF Core的日志....这里作为例子,只将日志记录在了调试窗口..当然也可以记录在自己的文件中..具体请参考LoggerFactory的相关说明.....这个库针对IQueryable进行了动态条件的扩展.....因为它是对IQueryable进行的扩展,所以没有数据库不支持的情况..只要有相关的驱动,就可以基于驱动来生成相关的SQL代码..(我这里访问的就是MySQL) .. 写在最后 就到这里了..

    1.9K60

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

    在上面的一系列新特性的支持下,微软通过大面积的构建扩展方法使得上述特性能连贯的互相作用,形成自然的集成查询框架。...其实这是构建与CTS之上的一种由编辑器负责处理的新的查询语法,它不是C#也不是VB.NET之类的托管语言。...关于链式查询方法也是一个对象设计问题,我们参见链式设计模式可以很自然的构建符合我们自己实际需求的链式查询方法,这一系列的查询方法的添加存在一个很大的问题就是无法动态的添加到要扩展的对象内部去。...2.4.深入IQueryable、IQueryable、Queryable(LINQ to Provider框架的入口) IQueryable接口是提供给我们来实现自定义数据源用的,为了支持强类型的数据源集合我们直接使用...IQueryable接口,当我们使用LINQ来查询IQueryable接口时查询表达式会被直接编译成对应的Queryable静态类中的对应的静态扩展方法。

    2.9K30

    .net EF 新手教程

    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(); 通过三个输出语句记录了对象从创建开始...,到添加到上下文,到保存的过程,大家先不用关注代码的意思,主要看下状态的变化。

    45000

    【源码解读(二)】EFCORE源码解读之查询都做了什么以及如何自定义批量插入

    public static IQueryable Take(this IQueryable source!!...的一个类型,最终自定义的实现的这个Queryable,里面的Expression就存储着我们组装的所有的表达式,相当于每次我们调用Queryable的方法的时候都会构建一个新的EntityQueryable...最终调用结束在List的构造函数里去创建一个新的List,GetEnumerable返回了我们本次的查询结果。...然后循环添加,这里只是一个简单的例子,感兴趣的朋友,可以自己去进行扩展,在AddRange,还有UpdateRange等批量操作的都会进去到这里,commandBatches是我们所有需要进行批量操作的记录...调用GetOriCreateEntry方法,然后TryGetEntry判断实体在不在上下文,在下面折叠的代码看到,内部是维护了一个五个字典类型的变量,分别对于detached,add,delete,modified

    79150

    用.env文件为NodeJS加载环境变量

    这些文件允许你指定各种环境变量及其相应的值。 在大多数情况下,你不希望将 .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" 运行代码时,应该能够在命令行输出中看到变量的值

    10.1K10

    从.env文件中为NodeJS加载环境变量

    这些文件允许你指定各种环境变量及其相应的值。 在大多数情况下,你不希望将 .env 文件添加到源代码控制中(即Git)。...因此,应该将它的文件名添加到 .gitignore 文件中,以确保在以后的提交中都被排除在外。...现在有了一个带有我们想要使用的变量的 .env 文件。但是应该如何将该变量加载到我们的代码中呢?...你可以使用以下命令中的任何一个来安装它: # Npm npm install dotenv --save # Yarn yarn add dotenv 成功安装 npm 软件包后,将以下两行添加到入口文件的顶部...你可以通过在 .env 文件中记录变量来测试它: // Node.js console.log(process.env.PASSWORD) //"12345" 运行代码时,应该能够在命令行输出中看到变量的值

    4.9K20
    领券