ABP框架8——仓储的作用及其基础Demo

一、使用仓储的好处

  • 1.提高CRUD接口复用性
  • 2.解耦业务逻辑(BLL)和增删改查(CRUD),换ORM特别方便,不需要改应用层,直接改仓储层
  • 3.做复杂查询
  • 4.事务支持

二、Demo

cs 复制代码
public class BookRepository : IBookRepository, ITransientDependency  //接口依赖注入
{
    private readonly IFreeSql _fsql;

    public BookRepository(IFreeSql fsql)
    {
        _fsql = fsql;
    }

    /// <summary>
    /// 获取FreeSql
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public IFreeSql GetFreeSql()
    {
        return _fsql;
    }

    /// <summary>
    /// 分页查询:Book
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [Route(nameof(GetBookPageListAsync))]
    public async Task<IPageList<BookDto>> GetBookPageListAsync(BookSerachInput input)
    {
        var output = new PageList<BookDto>(new List<BookDto>(), input.PageIndex, input.maxResultCount);
        if (false)
        {
            return output;//不符合要求,返回空数据
        }
        var fsql = GetFreeSql();
        //查表
        var queryList = await fsql.Select<Book>()
                        .Where(x => x.TimePoint.Between(input.StartTime, input.EndTime))
                        .WhereIf(input.StationCodes.Any(), x => input.StationCodes.Contains(x.CityCode))
                        .OrderBy(!string.IsNullOrEmpty(input.orderby), input.orderby)
                        .Page(input.PageIndex, input.maxResultCount)
                        .Count(out var totalCount)
                        .ToListAsync();
        //映射结果
        var dtoList = _objectMapper.Map<List<Book>, List<BookDto>>(queryList);
        return new PageList<BookDto>(dtoList, input.PageIndex, input.maxResultCount, totalCount);
    }

    /// <summary>
    /// Book 单一实体 修改
    /// </summary>
    public async Task<bool> UpdateBookAsync(BookDto input)
    {
        var fsql = GetFreeSql();
        return fsql.Update<BookDto>(input).ExecuteAffrows() != 0;
    }

    /// <summary>
    /// Book 单一实体 保存
    /// </summary>
    public async Task<bool> SaveBookAsync(BookDto input)
    {
        var fsql = GetFreeSql();
        bool isExist = await fsql.Select<Book>().AnyAsync(x => x.Id == input.Id);//【根据实际修改】根据(联合)主键确定唯一性
        if (isExist)
        {
            return await UpdateBookAsync(input);
        }
        return await InsertBookAsync(input);
    }

    /// <summary>
    /// Book 单一实体 插入
    /// </summary>
    public async Task<bool> InsertBookAsync(BookDto input)
    {
        var fsql = GetFreeSql();
        return fsql.Insert(input).ExecuteAffrows() != 0;
    }

    /// <summary>
    /// Book 单一实体 删除
    /// </summary>
    public async Task<bool> DeleteBookAsync(BookDto input)
    {
        var fsql = GetFreeSql();
        return fsql.Delete<BookDto>(input).ExecuteAffrows() != 0;
    }

    /// <summary>
    /// Book 列表 保存
    /// </summary>
    public async Task<bool> SaveBookListAsync(List<BookDto> inputList)
    {
        bool result = true;
        var fsql = GetFreeSql();

        //获取输入主键
        var inputKeyList = inputList.Select(x => x.Id ).Distinct().ToList();

        //根据输入主键获取已存在实体
        var existList = await fsql.Select<Book>().Where(x => inputKeyList.Contains(x.Id)).ToListAsync();

        //获取已存在实体的主键列表
        var existKeyList = existList.Select(x => x.Id).Distinct().ToList();

        // 获取更新列表和插入列表
        var updateList = inputList.Where(x => existKeyList.Contains(x.Id)).ToList();
        var insertList = inputList.Where(x => !existKeyList.Contains(x.Id)).ToList();

        /*联合主键:
            //获取输入主键
            var inputKeyList = inputList.Select(x => new { x.Id , x.BookName }).Distinct().ToList();
            //根据输入主键获取已存在实体
            var existList = await fsql.Select<Book>().Where(x=> inputKeyList.Any(key=>key.Id == x.Id && key.BookName == x.BookName)).ToListAsync();
            //获取已存在实体的主键列表
            var existKeyList = existList.Select(x => new { x.Id, x.BookName }).Distinct().ToList();
            //获取更新列表和插入列表
            var updateList = inputList.Where(x => existKeyList.Contains(new { x.Id, x.BookName })).ToList();
            var insertList = inputList.Where(x => !existKeyList.Contains(new { x.Id, x.BookName })).ToList();
       */

        // 使用批量更新和批量插入方法
        bool updateSuccess = await UpdateBookListAsync(updateList);  // 批量更新
        bool insertSuccess = await InsertBookListAsync(insertList);  // 批量插入

        return updateSuccess && insertSuccess; // 返回是否全部成功
    }

    /// <summary>
    /// Book 列表 修改
    /// </summary>
    public async Task<bool> UpdateBookListAsync(List<BookDto> input)
    {
        var fsql = GetFreeSql();
        return fsql.Update<BookDto>(input).ExecuteAffrows() != 0;
    }

    /// <summary>
    /// Book 列表 插入
    /// </summary>
    public async Task<bool> InsertBookListAsync(List<BookDto> input)
    {
        var fsql = GetFreeSql();
        return fsql.Insert(input).ExecuteAffrows() != 0;
    }

    /// <summary>
    /// Book 列表 删除
    /// </summary>
    public async Task<bool> DeleteBookListAsync(List<BookDto> input)
    {
        var fsql = GetFreeSql();
        return fsql.Delete<BookDto>(input).ExecuteAffrows() != 0;
    }

}
相关推荐
IT19955 小时前
Fail2Ban 防护 MySQL 实战|登录失败 3 次,IP 封禁 24 小时
数据库·mysql
夕除5 小时前
redis--IO 多路复用(select + poll)
数据库·sql
paopaokaka_luck8 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
lzhdim9 小时前
100条常用SQL语句
数据库·sql·mysql·mybatis
天河归来9 小时前
从原始消息到业务数据:三层数据架构的设计与实践
数据库·数据仓库·架构
数据库小学妹9 小时前
金融数据库成本怎么算?五笔钱加一张TCO表
数据库·金融行业·数据库选型·国产化替代·tco·金融数据库
KaiwuDB10 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式
auspicious航10 小时前
PostgreSQL的备份与恢复
数据库·postgresql
这个DBA有点耶10 小时前
从 MySQL 到时序数据库:我帮朋友做迁移的完整记录
数据库·架构·dba
泡海椒11 小时前
深度解析JQuick-SQL AST到逻辑计划转换机制|分布式SQL原理
数据库·分布式·sql