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