从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分)。
今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询性能。
举一个大家最常用功能 “分页” 功能。先贴一段代码。
totalCount) { using (var dbContext = new EntityFrameworkPlusDbContext()) { var orders = dbContext.Orders.OrderBy(o => o.CreateDateTime); totalCount = orders.Count(); var pagerOrders = orders.Skip((pageIndex - 1) * pageSize).Take(pageSize); return pagerOrders .ToList(); } }
这类型的代码,大家估计都看到过,也自己写过,简单分析一下。
orders.Count() 返回int 类型,肯定要查询出数据库才知道订单总笔数。
pagerOrders.ToList() 返回 IEnumerable<T> 类型,这个不用解释Entity Framework IEnumerable 和 IQueryable 区别是
IEnumerable 会执行SQL,IQueryable 而不会。所以这句也会去数据库查询一次。
那整个分页功能用Entity Framework 就是最少要两次数据库查询,刚刚上面说了,一个基本的提高性能方法就要减少与数据库打交道次数。
从“分页”功能来说,要是变成只有一次与数据库打交道,那就是对性能有大提升。Entity Framework 自身是没有提供这样的方法。
Entity Framework Plus 库 Query Future 扩展,是一个对Entity Framework 功能的延伸和扩展,能够做到减少数据库打交道次数。使查询性能更高。
一 . Entity Framework Plus 库 Query Future 安装
1. 解决方案 还是我上一篇 第一篇 Entity Framework Plus 之 Audit 用的解决方案“EntityFrameworkPlusSolution”,新增 “EntityFrameworkPlus.QueryFuture.Demo” 控制台项目,作为Entity Framework Plus 库 Query Future 扩展 应用和展示功能项目。项目结构截图如下
项目关系图 (代码图)
2. 为了方便Demo,新增商品业务 相关的 Model,Mapping,以及改动DbContext 如下代码
GoodsModel
using System; namespace EntityFrameworkPlus.Models { public class GoodsModel { public System.Guid GoodsGuid { get; set; } public string GoodsNo { get; set; } public string GoodsName { get; set; } public string GoodsBrand { get; set; } public decimal UnitPrice { get; set; } public string Description { get; set; } public string Creator { get; set; } public System.DateTime CreateDateTime { get; set; } public string LastModifier { get; set; } public DateTime? LastModifiedDateTime { get; set; } } }
GoodsMap
using System.Data.Entity.ModelConfiguration; using EntityFrameworkPlus.Models; namespace EntityFrameworkPlus.Mappings { public class GoodsMap: EntityTypeConfiguration<GoodsModel> { public GoodsMap() { .HasKey(t => t.GoodsGuid); .Property(t => t.GoodsNo) .IsRequired() .HasMaxLength(50); this.Property(t => t.GoodsName) .IsRequired() .HasMaxLength(50); this.Property(t => t.GoodsBrand) .IsRequired() .HasMaxLength(50); this.Property(t => t.Creator) .IsRequired() .HasMaxLength(20); this.Property(t => t.LastModifier) .HasMaxLength(20); .ToTable(); ); ); ); ); ); ); ); ); ); ); } } }
EntityFrameworkPlusDbContext