简介
之前写个一个基于Dapper的分页完成,如今再来写一个基于Entity Framework的分页完成,以及增编削的通用完成。
代码
怎样运转示例
照样像先前一样:
1. 先Clone下代码,在Database内里解压缩Database.7z
2. Attach到Sql Server LocalDB上。假如你用的不是Sql Server的LocalDB,你须要变动App.Config里的衔接字符串。
3. Ctrl + F5,运转示例顺序。
Repository 基类 - 查询
Common\AbstractRepository.cs 是Repository的基类,完成了增编削查的一些要领,比方:
public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria , int pageIndex , int pageSize , string[] asc , string[] desc , params Expression<Func<T, object>>[] includeProperties)
这个要领是AbstractRepository查询要领中的一个,用于自定义分页查询,个中criteria 为一个表达式,作为查询的前提,参数pageIndex, pageSize, asc, desc为分页相干参数;
关于多表(关联表):
includeProperties为在多表时刻,Join相干联的表。因为EF默许是Lazy Loading,相干联的表默许不是马上加载的,所以有时刻假如写代码不小心,在for轮回里就有可能会轮回查询n个字表。用来includeProperties参数,就能够在查询时刻join关联表。
Repository 基类 - 增编削
AbstractRepository已用泛型完成了增编削要领:
public virtual T Create(T entity)
public virtual T Update(T entity)
public virtual T CreateOrUpdate(T entity)
public virtual void Delete(TId id)
别的,关于transaction的完成,我运用了Unit of Work形式,多个Repository同享一个DBContext,关于UOW,请在Common\UnitOfWork.cs里找到。
挪用UOW的时刻,基础类似于如许:
var uow = new EFUnitOfWork(); var repo = uow.GetLogRepository(); repo.Create(new Log { LevelId = 1, Thread = "", Location = "Manual Creation", Message = "This is manually created log.", CreateTime = DateTimeOffset.Now, Date = DateTime.Now }); uow.Commit();
从UnitOfWork里获得一个或多个Repository,同享DBContext,做增编削操纵,末了uow一致SaveChanges。
Repository的派生类
因为已有了AbstractRepository,完成了增编削查的许多要领,所以派生类,比方示例项目里的LogRepository基础就能够变得很简单,重要完成一些特定的营业逻辑,在示例项目里,因为没有特别的营业逻辑,所以会很简单:
public class LogRepository : AbstractRepository<Log, int> { public LogRepository(EFContext context) : base(context) { } }
关于Entity的生成
本人比较喜好Database First 完成,先设想数据库,然后用edmx reverse engineering,生成POCO。能够参考Entity目录下的相干文件。
固然,假如你喜好Code First,一样没有题目,依然实用本文的完成。
运用Logging日记追踪EF SQL
在运用Entity Framework的时刻,最好体贴一下EF所生成的SQL,如许能够在开辟阶段发明一些潜伏的机能题目,防止在生产环境焦头烂额:)
在Common\EFContext.cs 里,有一个设置项EnableTraceSql,假如为true,那末所以EF生成的SQL将会被nlog纪录下来。我将nlog的日记设置到了数据库。也就是说,在你运转示例项目时,每次查询,都邑增添新的日记纪录,内容为查询时生成的SQL:
Specification Pattern
在查询要领里,有个重载是接收一个ISpecification示例,如许的完成能够有用的掌握营业逻辑,关于写给被其他人挪用的接口来讲,能够明白的肯定查询参数,比方:
public class LogSearchSpecification : ISpecification<Log> { public string LevelName { get; set; } public string Message { get; set; } public Expression<Func<Log, bool>> ToExpression() { return log => (log.Level.Name == LevelName || LevelName == "") && (log.Message.Contains(Message) || Message == ""); } public bool IsSatisfiedBy(Log entity) { return (entity.Level.Name == LevelName || LevelName == "") && (entity.Message.Contains(Message) || Message == ""); } }
那末,挪用这个查询要领的代码就能够明白晓得,我的查询前提为LevelName和Message,至于LevelName是即是以及Message为Like则是在LogSearchSpeficiation里完成,做到很好的封装。
末了
这套完成是几年来日常平凡逐步积聚的,是经由实践的,所以应当能够作为肯定的参考,固然,在详细的项目里,能够用一些DI去拿到Repository等等,不在本文议论局限,人人能够自由发挥,愿望对人人能够有所协助,感谢。
以上就是详述Entity Framework自定义分页结果完成要领的细致内容,更多请关注ki4网别的相干文章!