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

一、使用仓储的好处

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

二、Demo

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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498545.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…

3D数学基础2

矩阵的行列式 在任意方阵中都存在至少一个标量&#xff0c;称作该方阵的行列式。在线性代数中&#xff0c;行列式有很多有用的性质 线性运算法则 方阵 M M M的行列式记作 ∣ M ∣ |M| ∣M∣或“det M”。非方阵矩阵的行列式是未定义的。 注意&#xff0c;在书写行列式时&…

elementui的默认样式修改

今天用element ui &#xff0c;做了个消息提示&#xff0c;发现提示的位置总是在上面&#xff0c;如图&#xff1a; 可是我想让提示的位置到下面来&#xff0c;该怎么办&#xff1f; 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码…

WebRTC:实现浏览器与移动应用的实时通信

1.技术简介 &#xff08;Web Real-Time&#xff09;是一种开放式实时通信技术&#xff0c;旨在使浏览器和移动应用程序通过简单的API即可实现实时音频、视频和数据传输&#xff0c;而无需安装插件或额外软件。它支持网络应用中的点对点通信&#xff0c;例如视频聊天、语音通话…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中&#xff0c;FFmpeg常用于从各种源&#xff08;如摄像头、文件、网络流等&#xff09;获取流媒体数据&#xff0c;这个过程通常称为“取流”。 在EasyNVR平台中&#xff0c;使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

NXP i.MX8系列平台开发讲解 - 5.4 调试篇 - 掌握perf 工具调试(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 掌握perf 工具调试(一) 1. Perf 工具介绍 1.1 Perf 工作原理 1.2 Perf 工具基本功能 2. Perf 安…

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…

Python 青铜宝剑十六维,破医疗数智化难关(上)

一、医疗数智化困境剖析 在当今数智化浪潮的席卷下&#xff0c;医疗行业正经历着深刻变革&#xff0c;医疗数智化转型已成为不可阻挡的趋势。它将现代信息技术深度融入医疗的各个环节&#xff0c;从电子病历的广泛普及&#xff0c;实现医疗信息的便捷存储与快速查阅&#xff0…

Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案

文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肝细胞癌&#xff08;hepatocellular carcinoma&#xff0c;HCC&#xff09;早期复发仍然是一个具有挑战性的领域&#xff0c;其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…

代码随想录算法【Day7】

DAY7 454.四数相加II 特点&#xff1a; 1.只用返回元组的个数&#xff0c;而不用返回具体的元组 2.可以不用去重 暴力思路&#xff1a;遍历&#xff0c;这样时间复杂度会达到O(n^4) 标准思路&#xff1a;用哈希法&#xff08;场景&#xff1a;在一个集合里面判断一个元素…

[TOTP]android kotlin实现 totp身份验证器 类似Google身份验证器

背景&#xff1a;自己或者公司用一些谷歌身份验证器或者microsoft身份验证器&#xff0c;下载来源不明&#xff0c;或者有广告&#xff0c;使用不安全。于是自己写一个&#xff0c;安全放心使用。 代码已开源&#xff1a;shixiaotian/sxt-android-totp: android totp authenti…

Type c系列接口驱动电路·内置供电驱动电路使用USB2.0驱动电路!!!

目录 前言 Type c常见封装类型 Type c引脚功能详解 Type c常见驱动电路详解 Type c数据手册 ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路…

【竞技宝】LOL:IG新赛季分组被质疑

北京时间2024年12月31日&#xff0c;今天已经2024年的最后一天&#xff0c;在进入一月之后&#xff0c;英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉&#xff0c;其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…

【大模型实战篇】Mac本地部署RAGFlow的踩坑史

1. 题外话 最近一篇文章还是在11月30日写的&#xff0c;好长时间没有打卡了。最近工作上的事情特别多&#xff0c;主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed&#xff0c;后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…

Prompt工程--AI开发--可置顶粘贴小工具

PROMPT 1.背景要求&#xff1a;我需要开发一个简单的粘贴小工具&#xff0c;用于方便地粘贴和管理文本内容。该工具需要具备以下功能&#xff1a;粘贴功能&#xff1a;提供一个文本框&#xff0c;用户可以粘贴内容。窗口置顶&#xff1a;支持窗口置顶功能&#xff0c;确保窗口…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…

它真的可以绕过 ICloud 激活吗

作为最著名的越狱辅助应用程序之一&#xff0c;3u工具 非常出色地将各种越狱工具和功能集成到一个应用程序中。除了越狱之外&#xff0c;3u工具 有时也被认为是 iCloud 激活锁绕过工具。 但3u工具真的能绕过激活锁吗&#xff1f; 如果没有的话还有其他的应用吗&#xff1f; 这…

手写顺序流程图组件

效果图 完整代码 <template><div><div class"container" :style"{ width: ${spacingX * (colNum - 1) itemWidth * colNum}px }"><divv-for"(item, i) in recordList":key"i"class"list-box":style&…

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)

导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行&#xff0c;以及多域耦合、AI求解加速&#xff0c;目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地&#xff0c;支持10亿阶、100w核心量级的高效求解。其低…