using AutoMapper; using AutoMapper.QueryableExtensions; using EFCoreSecondLevelCacheInterceptor; using Masuit.LuceneEFCore.SearchEngine; using Masuit.MyBlogs.Core.Infrastructure.Repository.Interface; using Masuit.Tools.Core.AspNetCore; using Masuit.Tools.Models; using Masuit.Tools.Systems; using Microsoft.EntityFrameworkCore; using System.Linq.Expressions; using Z.EntityFramework.Plus; namespace Masuit.MyBlogs.Core.Infrastructure.Repository { /// /// DAL基类 /// /// 实体类型 public abstract class BaseRepository : Disposable, IBaseRepository where T : LuceneIndexableBaseEntity { public virtual DataContext DataContext { get; set; } public MapperConfiguration MapperConfig { get; set; } /// /// 获取所有实体 /// /// 还未执行的SQL语句 public virtual IQueryable GetAll() { return DataContext.Set(); } /// /// 获取所有实体(不跟踪) /// /// 还未执行的SQL语句 public virtual IQueryable GetAllNoTracking() { return DataContext.Set().AsNoTracking(); } /// /// 从二级缓存获取所有实体 /// /// public virtual IEnumerable GetAllFromCache() { return DataContext.Set().Cacheable().AsEnumerable(); } /// /// 从二级缓存获取所有实体 /// /// public Task> GetAllFromCacheAsync() { return DataContext.Set().Cacheable().ToListAsync(); } /// /// 获取所有实体(不跟踪) /// /// 映射实体 /// 还未执行的SQL语句 public virtual IQueryable GetAll() where TDto : class { return DataContext.Set().AsNoTracking().ProjectTo(MapperConfig); } /// /// 从二级缓存获取所有实体(不跟踪) /// /// 映射实体 /// public virtual List GetAllFromCache() where TDto : class { return DataContext.Set().AsNoTracking().ProjectTo(MapperConfig).Cacheable().ToList(); } /// /// 从二级缓存获取所有实体(不跟踪) /// /// 映射实体 /// public Task> GetAllFromCacheAsync() where TDto : class { return DataContext.Set().AsNoTracking().ProjectTo(MapperConfig).Cacheable().ToListAsync(); } /// /// 获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetAll(Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().OrderBy(orderby) : DataContext.Set().OrderByDescending(orderby); } /// /// 获取所有实体(不跟踪) /// /// 排序 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetAllNoTracking(Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().AsNoTracking().OrderBy(orderby) : DataContext.Set().AsNoTracking().OrderByDescending(orderby); } /// /// 从二级缓存获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// public virtual List GetAllFromCache(Expression> orderby, bool isAsc = true) { return GetAll(orderby, isAsc).Cacheable().ToList(); } /// /// 从二级缓存获取所有实体 /// /// 排序 /// 排序字段 /// 是否升序 /// public Task> GetAllFromCacheAsync(Expression> @orderby, bool isAsc = true) { return GetAll(orderby, isAsc).Cacheable().ToListAsync(); } /// /// 获取所有实体 /// /// 排序 /// 映射实体 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IQueryable GetAll(Expression> orderby, bool isAsc = true) where TDto : class { return GetAllNoTracking(orderby, isAsc).ProjectTo(MapperConfig); } /// /// 从二级缓存获取所有实体 /// /// 排序 /// 映射实体 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual List GetAllFromCache(Expression> orderby, bool isAsc = true) where TDto : class { return GetAllNoTracking(orderby, isAsc).ProjectTo(MapperConfig).Cacheable().ToList(); } /// /// 从二级缓存获取所有实体 /// /// 排序 /// 映射实体 /// 排序字段 /// 是否升序 /// public Task> GetAllFromCacheAsync(Expression> @orderby, bool isAsc = true) where TDto : class { return GetAllNoTracking(orderby, isAsc).ProjectTo(MapperConfig).Cacheable().ToListAsync(); } /// /// 基本查询方法,获取一个集合 /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQuery(Expression> where) { return DataContext.Set().Where(where); } /// /// 基本查询方法,获取一个集合 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetQuery(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().Where(where).OrderBy(orderby) : DataContext.Set().Where(where).OrderByDescending(orderby); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 查询条件 /// public virtual List GetQueryFromCache(Expression> @where) { return DataContext.Set().Where(where).Cacheable().ToList(); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 查询条件 /// public Task> GetQueryFromCacheAsync(Expression> @where) { return DataContext.Set().Where(where).Cacheable().ToListAsync(); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 排序字段 /// 查询条件 /// 排序方式 /// 是否升序 /// public virtual List GetQueryFromCache(Expression> where, Expression> orderby, bool isAsc = true) { return GetQuery(where, orderby, isAsc).Cacheable().ToList(); } /// /// 基本查询方法,获取一个集合,优先从二级缓存读取 /// /// 排序字段 /// 查询条件 /// 排序方式 /// 是否升序 /// public Task> GetQueryFromCacheAsync(Expression> @where, Expression> @orderby, bool isAsc = true) { return GetQuery(where, orderby, isAsc).Cacheable().ToListAsync(); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取 /// /// 排序字段 /// 输出类型 /// 查询条件 /// 排序方式 /// 是否升序 /// public Task> GetQueryFromCacheAsync(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return GetQueryNoTracking(where, orderby, isAsc).ProjectTo(MapperConfig).Cacheable().ToListAsync(); } /// /// 基本查询方法,获取一个集合(不跟踪实体) /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQueryNoTracking(Expression> where) { return DataContext.Set().Where(where).AsNoTracking(); } /// /// 基本查询方法,获取一个集合(不跟踪实体) /// /// 排序字段 /// 查询条件 /// 排序方式 /// 是否升序 /// 还未执行的SQL语句 public virtual IOrderedQueryable GetQueryNoTracking(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().Where(where).AsNoTracking().OrderBy(orderby) : DataContext.Set().Where(where).AsNoTracking().OrderByDescending(orderby); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合(不跟踪实体) /// /// 查询条件 /// 还未执行的SQL语句 public virtual IQueryable GetQuery(Expression> where) where TDto : class { return DataContext.Set().Where(where).AsNoTracking().ProjectTo(MapperConfig); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合(不跟踪实体) /// /// 排序字段 /// 输出类型 /// 查询条件 /// 排序方式 /// 是否升序 /// 还未执行的SQL语句 public virtual IQueryable GetQuery(Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { return GetQueryNoTracking(where, orderby, isAsc).ProjectTo(MapperConfig); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体) /// /// 查询条件 /// 实体集合 public virtual List GetQueryFromCache(Expression> where) where TDto : class { return DataContext.Set().Where(where).AsNoTracking().ProjectTo(MapperConfig).Cacheable().ToList(); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取 /// /// 查询条件 /// public Task> GetQueryFromCacheAsync(Expression> @where) where TDto : class { return DataContext.Set().Where(where).AsNoTracking().ProjectTo(MapperConfig).Cacheable().ToListAsync(); } /// /// 基本查询方法,获取一个被AutoMapper映射后的集合,优先从二级缓存读取(不跟踪实体) /// /// 排序字段 /// 输出类型 /// 查询条件 /// 排序方式 /// 是否升序 /// public virtual List GetQueryFromCache(Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { return GetQueryNoTracking(where, orderby, isAsc).ProjectTo(MapperConfig).Cacheable().ToList(); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public virtual T Get(Expression> where) { return EF.CompileQuery((DataContext ctx) => ctx.Set().FirstOrDefault(where))(DataContext); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public virtual T GetFromCache(Expression> where) { return DataContext.Set().Where(where).DeferredFirstOrDefault().Execute(); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public Task GetFromCacheAsync(Expression> @where) { return DataContext.Set().Where(where).DeferredFirstOrDefault().ExecuteAsync(); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual T Get(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set().OrderByDescending(orderby).FirstOrDefault(where))(DataContext); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual T GetFromCache(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().OrderBy(orderby).Where(where).DeferredFirstOrDefault().Execute() : DataContext.Set().OrderByDescending(orderby).Where(where).DeferredFirstOrDefault().Execute(); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public Task GetFromCacheAsync(Expression> @where, Expression> @orderby, bool isAsc = true) { return isAsc ? DataContext.Set().OrderBy(orderby).Where(where).DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set().OrderByDescending(orderby).Where(where).DeferredFirstOrDefault().ExecuteAsync(); } /// /// 获取第一条被AutoMapper映射后的数据(不跟踪) /// /// 排序 /// 映射实体 /// 查询条件 /// 排序字段 /// 是否升序 /// 映射实体 public Task GetAsync(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return isAsc ? DataContext.Set().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo(MapperConfig).FirstOrDefaultAsync() : DataContext.Set().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo(MapperConfig).FirstOrDefaultAsync(); } /// /// 获取第一条被AutoMapper映射后的数据(不跟踪) /// /// 排序 /// 映射实体 /// 查询条件 /// 排序字段 /// 是否升序 /// 映射实体 public virtual TDto GetFromCache(Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { return isAsc ? DataContext.Set().Where(where).OrderBy(orderby).ProjectTo(MapperConfig).DeferredFirstOrDefault().Execute() : DataContext.Set().Where(where).OrderByDescending(orderby).ProjectTo(MapperConfig).DeferredFirstOrDefault().Execute(); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 排序 /// 映射实体 /// 查询条件 /// 排序字段 /// 是否升序 /// 映射实体 public Task GetFromCacheAsync(Expression> @where, Expression> @orderby, bool isAsc = true) where TDto : class { return isAsc ? DataContext.Set().Where(where).OrderBy(orderby).ProjectTo(MapperConfig).DeferredFirstOrDefault().ExecuteAsync() : DataContext.Set().Where(where).OrderByDescending(orderby).ProjectTo(MapperConfig).DeferredFirstOrDefault().ExecuteAsync(); } /// /// 获取第一条数据 /// /// 查询条件 /// 实体 public virtual Task GetAsync(Expression> where) { return EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().FirstOrDefault(where))(DataContext); } /// /// 获取第一条数据 /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual Task GetAsync(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().OrderByDescending(orderby).FirstOrDefault(where))(DataContext); } /// /// 获取第一条数据(不跟踪实体) /// /// 查询条件 /// 实体 public virtual T GetNoTracking(Expression> where) { return EF.CompileQuery((DataContext ctx) => ctx.Set().AsNoTracking().FirstOrDefault(where))(DataContext); } /// /// 获取第一条数据(不跟踪实体) /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual T GetNoTracking(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? EF.CompileQuery((DataContext ctx) => ctx.Set().AsNoTracking().OrderBy(orderby).FirstOrDefault(where))(DataContext) : EF.CompileQuery((DataContext ctx) => ctx.Set().AsNoTracking().OrderByDescending(orderby).FirstOrDefault(where))(DataContext); } /// /// 获取第一条被AutoMapper映射后的数据(不跟踪实体) /// /// 查询条件 /// 实体 public virtual TDto Get(Expression> where) where TDto : class { return DataContext.Set().Where(where).AsNoTracking().ProjectTo(MapperConfig).FirstOrDefault(); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 查询条件 /// 实体 public virtual TDto GetFromCache(Expression> where) where TDto : class { return DataContext.Set().Where(where).ProjectTo(MapperConfig).DeferredFirstOrDefault().Execute(); } /// /// 获取第一条被AutoMapper映射后的数据 /// /// 查询条件 /// 实体 public Task GetFromCacheAsync(Expression> @where) where TDto : class { return DataContext.Set().Where(where).ProjectTo(MapperConfig).DeferredFirstOrDefault().ExecuteAsync(); } /// /// 获取第一条被AutoMapper映射后的数据(不跟踪实体) /// /// 映射实体 /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual TDto Get(Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { return isAsc ? DataContext.Set().Where(where).OrderBy(orderby).AsNoTracking().ProjectTo(MapperConfig).FirstOrDefault() : DataContext.Set().Where(where).OrderByDescending(orderby).AsNoTracking().ProjectTo(MapperConfig).FirstOrDefault(); } /// /// 获取第一条数据(异步,不跟踪实体) /// /// 查询条件 /// 实体 public virtual Task GetNoTrackingAsync(Expression> where) { return EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().AsNoTracking().FirstOrDefault(@where))(DataContext); } /// /// 获取第一条数据(异步,不跟踪实体) /// /// 排序 /// 查询条件 /// 排序字段 /// 是否升序 /// 实体 public virtual Task GetNoTrackingAsync(Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().OrderBy(orderby).AsNoTracking().FirstOrDefault(where))(DataContext) : EF.CompileAsyncQuery((DataContext ctx) => ctx.Set().OrderByDescending(orderby).AsNoTracking().FirstOrDefault(where))(DataContext); } /// /// 根据ID找实体 /// /// 实体id /// 实体 public virtual T GetById(int id) { return EF.CompileQuery((DataContext ctx, int xid) => ctx.Set().FirstOrDefault(t => t.Id == xid))(DataContext, id); } /// /// 根据ID找实体(异步) /// /// 实体id /// 实体 public virtual Task GetByIdAsync(int id) { return EF.CompileAsyncQuery((DataContext ctx, int xid) => ctx.Set().FirstOrDefault(t => t.Id == xid))(DataContext, id); } /// /// 高效分页查询方法 /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual PagedList GetPages(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc) { return isAsc ? DataContext.Set().Where(where).NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize); } /// /// 高效分页查询方法 /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual Task> GetPagesAsync(int pageIndex, int pageSize, Expression> @where, Expression> orderby, bool isAsc) { return isAsc ? DataContext.Set().Where(where).NotCacheable().OrderBy(orderby).ToPagedListAsync(pageIndex, pageSize) : DataContext.Set().Where(where).NotCacheable().OrderByDescending(orderby).ToPagedListAsync(pageIndex, pageSize); } /// /// 高效分页查询方法,优先从二级缓存读取 /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual PagedList GetPagesFromCache(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc) { var temp = DataContext.Set().Where(where); return isAsc ? temp.OrderBy(orderby).ToCachedPagedList(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedList(pageIndex, pageSize); } /// /// 高效分页查询方法,优先从二级缓存读取 /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual Task> GetPagesFromCacheAsync(int pageIndex, int pageSize, Expression> @where, Expression> @orderby, bool isAsc) { var temp = DataContext.Set().Where(where); return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync(pageIndex, pageSize) : temp.OrderByDescending(orderby).ToCachedPagedListAsync(pageIndex, pageSize); } /// /// 高效分页查询方法,优先从二级缓存读取,取出被AutoMapper映射后的数据集合 /// /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public Task> GetPagesFromCacheAsync(int pageIndex, int pageSize, Expression> @where, Expression> @orderby, bool isAsc) where TDto : class { var temp = DataContext.Set().Where(where).AsNoTracking(); return isAsc ? temp.OrderBy(orderby).ToCachedPagedListAsync(pageIndex, pageSize, MapperConfig) : temp.OrderByDescending(orderby).ToCachedPagedListAsync(pageIndex, pageSize, MapperConfig); } /// /// 高效分页查询方法(不跟踪实体) /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual PagedList GetPagesNoTracking(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc = true) { return isAsc ? DataContext.Set().Where(where).AsNoTracking().NotCacheable().OrderBy(orderby).ToPagedList(pageIndex, pageSize) : DataContext.Set().Where(where).AsNoTracking().NotCacheable().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize); } /// /// 高效分页查询方法,取出被AutoMapper映射后的数据集合(不跟踪实体) /// /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual PagedList GetPages(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { return isAsc ? DataContext.Set().Where(where).AsNoTracking().OrderBy(orderby).ToPagedList(pageIndex, pageSize, MapperConfig) : DataContext.Set().Where(where).AsNoTracking().OrderByDescending(orderby).ToPagedList(pageIndex, pageSize, MapperConfig); } /// /// 高效分页查询方法,取出被AutoMapper映射后的数据集合 /// /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public Task> GetPagesAsync(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc) where TDto : class { return isAsc ? DataContext.Set().Where(where).AsNoTracking().OrderBy(orderby).ToPagedListAsync(pageIndex, pageSize, MapperConfig) : DataContext.Set().Where(where).AsNoTracking().OrderByDescending(orderby).ToPagedListAsync(pageIndex, pageSize, MapperConfig); } /// /// 高效分页查询方法,取出被AutoMapper映射后的数据集合,优先从缓存读取(不跟踪实体) /// /// /// /// 第几页 /// 每页大小 /// where Lambda条件表达式 /// orderby Lambda条件表达式 /// 升序降序 /// public virtual PagedList GetPagesFromCache(int pageIndex, int pageSize, Expression> where, Expression> orderby, bool isAsc = true) where TDto : class { var temp = DataContext.Set().Where(where).AsNoTracking(); return isAsc ? temp.OrderBy(orderby).ToCachedPagedList(pageIndex, pageSize, MapperConfig) : temp.OrderByDescending(orderby).ToCachedPagedList(pageIndex, pageSize, MapperConfig); } /// /// 根据ID删除实体 /// /// 实体id /// 删除成功 public virtual bool DeleteById(int id) { return DataContext.Set().Where(t => t.Id == id).Delete() > 0; } /// /// 根据ID删除实体 /// /// 实体id /// 删除成功 public virtual Task DeleteByIdAsync(int id) { return DataContext.Set().Where(t => t.Id == id).DeleteAsync(); } /// /// 删除实体 /// /// 需要删除的实体 /// 删除成功 public virtual bool DeleteEntity(T t) { DataContext.Entry(t).State = EntityState.Unchanged; DataContext.Entry(t).State = EntityState.Deleted; DataContext.Remove(t); return true; } /// /// 根据条件删除实体 /// /// 查询条件 /// 删除成功 public virtual int DeleteEntity(Expression> where) { return DataContext.Set().Where(where).Delete(); } /// /// 根据条件删除实体(异步) /// /// 查询条件 /// 删除成功 public virtual Task DeleteEntityAsync(Expression> where) { return DataContext.Set().Where(where).DeleteAsync(); } /// /// 添加实体 /// /// 需要添加的实体 /// 添加成功 public abstract T AddEntity(T t); /// /// 添加或更新实体 /// /// 更新键规则 /// 需要保存的实体 /// 保存成功 public T AddOrUpdate(Expression> key, T t) { DataContext.Set().AddOrUpdate(key, t); return t; } /// /// 添加或更新实体 /// /// 更新键规则 /// 需要保存的实体 /// 保存成功 public void AddOrUpdate(Expression> key, params T[] entities) { DataContext.Set().AddOrUpdate(key, entities); } /// /// 添加或更新实体 /// /// 更新键规则 /// 需要保存的实体 /// 保存成功 public void AddOrUpdate(Expression> key, IEnumerable entities) { DataContext.Set().AddOrUpdate(key, entities); } /// /// 统一保存数据 /// /// 受影响的行数 public virtual int SaveChanges() { return DataContext.SaveChanges(); } /// /// 统一保存数据(异步) /// /// 受影响的行数 public virtual Task SaveChangesAsync() { return DataContext.SaveChangesAsync(); } /// /// 判断实体是否在数据库中存在 /// /// 查询条件 /// 是否存在 public virtual bool Any(Expression> where) { return EF.CompileQuery((DataContext ctx) => ctx.Set().Any(where))(DataContext); } /// /// 符合条件的个数 /// /// 查询条件 /// 是否存在 public virtual int Count(Expression> where) { return EF.CompileQuery((DataContext ctx) => ctx.Set().Count(where))(DataContext); } /// /// 删除多个实体 /// /// 实体集合 /// 删除成功 public virtual bool DeleteEntities(IEnumerable list) { DataContext.RemoveRange(list); return true; } /// /// 添加多个实体 /// /// 实体集合 /// 添加成功 public virtual IEnumerable AddEntities(IList list) { DataContext.AddRange(list); return list; } public override void Dispose(bool disposing) { //DataContext?.Dispose(); //DataContext = null; } public T this[int id] => GetById(id); } public static class QueryableExt { /// /// 从二级缓存生成分页集合 /// /// /// /// 当前页 /// 页大小 /// public static PagedList ToCachedPagedList(this IOrderedQueryable query, int page, int size) where T : LuceneIndexableBaseEntity { var totalCount = query.Count(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).Cacheable().ToList(); return new PagedList(list, page, size, totalCount); } /// /// 从二级缓存生成分页集合 /// /// /// /// 当前页 /// 页大小 /// public static async Task> ToCachedPagedListAsync(this IOrderedQueryable query, int page, int size) where T : LuceneIndexableBaseEntity { var totalCount = query.Count(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = await query.Skip(size * (page - 1)).Take(size).Cacheable().ToListAsync(); return new PagedList(list.ToList(), page, size, totalCount); } /// /// 生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static PagedList ToPagedList(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) { var totalCount = query.Count(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).NotCacheable().ToList(); return new PagedList(list, page, size, totalCount); } /// /// 生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static async Task> ToPagedListAsync(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) { var totalCount = await query.CountAsync(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).NotCacheable().ToListAsync(); return new PagedList(list, page, size, totalCount); } /// /// 从二级缓存生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static PagedList ToCachedPagedList(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity { var totalCount = query.Count(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).Cacheable().ToList(); return new PagedList(list, page, size, totalCount); } /// /// 从二级缓存生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static async Task> ToCachedPagedListAsync(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity { var totalCount = query.Count(); if (page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).Cacheable().ToListAsync(); return new PagedList(list.ToList(), page, size, totalCount); } } }