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.mzph.cn/pingmian/66088.shtml

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

相关文章

毕设中所学

1、交叉引用 在毕业设计论文Word中交叉引用参考文献_交叉引用如何标注[1~6]-CSDN博客 另&#xff1a;将标号或其他文字改为上标的快捷键是CtrlShift。 图的交叉引用一样&#xff0c;修改引用类型即可。 2、ENVI安装 ENVI5.6 安装教程&#xff0c;新手入门&#xff08;超详细…

git 问题解决记录

在用git上传文件到仓库中出现了2个问题 第一个问题&#xff1a; 需要修改git的代理端口与电脑自己的代理服务器设置中的端口和VPN的端口保持一致&#xff0c; 比如我的端口是7897&#xff0c;就设置 git config --global http.proxy http://127.0.0.1:7897 git config --glo…

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和…

RK3588+麒麟国产系统+FPGA+AI在电力和轨道交通视觉与采集系统的应用

工业视觉识别系统厂家提供的功能主要包括&#xff1a; 这些厂家通过先进的视觉识别技术&#xff0c;实现图像的采集、处理与分析。系统能够自动化地完成质量检测、物料分拣、设备监控等任务&#xff0c;显著提升生产效率和产品质量。同时&#xff0c;系统具备高度的灵活性和可扩…

物联网控制期末复习

第3章 物联网控制系统的过程通道设计 3.1 模拟量输出通道 3.1.1单模拟量输出通道的构成 计算机控制系统的模拟量输出通道将计算机产生的数字控制信号转换为模拟信号&#xff08;电压或电流&#xff09;作用于执行机构&#xff0c;以实现对被控对象的控制。 多D/A结构&#…

python3中的生成器

一. 简介 前面简单学习了 python3中的迭代器&#xff0c;本文来学习 python3中生成器。 在 Python 中&#xff0c;生成器&#xff08;Generator&#xff09;是一种特殊的迭代器&#xff0c;在 Python 中&#xff0c;生成器&#xff08;Generator&#xff09;是一种特殊的迭代…

js的一些处理

1.翻转字符串 let str abcdef str str.split().reverse().join() console.log(str) 因此想到了我之前写的截取字符串获取参数跳转&#xff0c;在写一遍 let str nameJack&age18&gender男 let list str.split(&); let obj {} list.forEach((v)>{ …

vue3 css实现文字输出带光标显示,文字输出完毕,光标消失的效果

Vue实现过程如下&#xff1a; <template><div ><p ref"dom_element" class"typing" :class"{over_fill: record_input_over}"></p></div> </template> <script setup> import {onMounted, ref} from…

[C++]vector(超详细)

在学习完了string后&#xff0c;我们来学习新的STL容器vector&#xff0c;是真正的属于STL中的一员&#xff0c;vector也是STL的基础容器&#xff0c;英文释义是向量&#xff0c;其实实质上就是顺序表。 在这个部分我们会学习的非常快&#xff0c;第一个原因是由于vector的设计…

算法 class 005 (对数器C语言实现)

对数器的概念&#xff1a; 用来测试你的算法是否正确。 怎么做呢&#xff1f; 1&#xff1a;比如&#xff0c;写个冒泡排序&#xff0c;作为对比的对象 2&#xff1a;生成一个随机数 数组&#xff0c;用来测试 3&#xff1a;用冒泡排序和你想要验证的那个排序算法&#xff0c;同…

风力涡轮机缺陷检测数据集,91.4%准确识别率,18912张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;91.4&#xff05;准确识别率&#xff0c;18912张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载&#xff1a; &#xff59;&#xff4f;&#xff4c;&#xff4f; &#xff56;&#…

termux配置nginx+php

只能以默认用户u0_axx运行,修改用户会报错An error occurred.或者file no found 安装nginx pkg install nginx安装php-fpm pkg install nginx修改nginx配置文件, nano ../usr/etc/nginx/nginx.conf#端口必须设置在1024以上(1024以下需要root,但php-fpm不能以root用户运行,n…

机器人对物体重定向操作的发展简述

物体重定向操作的发展简述 前言1、手内重定向和外部重定向2、重定向原语3、重定向状态转换网络4、连续任意姿态的重定向5、利用其他环境约束重定向总结Reference 前言 对于一些特殊的任务&#xff08;如装配和打包&#xff09;&#xff0c;对物体放置的位姿由明确的要求&#…

k8s基础(1)—Kubernetes-Pod

一、Pod简介 Pod是Kubernetes&#xff08;k8s&#xff09;系统中可以创建和管理的最小单元&#xff0c;是资源对象模型中由用户创建或部署的最小资源对象模型‌。Pod是由一个或多个容器组成的&#xff0c;这些容器共享存储和网络资源&#xff0c;可以看作是一个逻辑的主机‌。…

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行

集线器,交换机,路由器,mac地址和ip地址知识记录总结

一篇很不错的视频简介 基本功能 从使用方面来说&#xff0c;都是为了网络传输的标识&#xff0c;和机器确定访问对象 集线器、交换机和路由器 常听到路由器和集线器&#xff0c;下面是区别&#xff1a; 集线器 集线器&#xff1a;一个简单的物理扩展接口数量的物理硬件。…

跳跃表(跳表)是什么

为什么要有跳表 正常链表只能一个一个往下走但是如果我直到我的目标位置就在链表的中部但是我还得一步一步走过去很浪费时间&#xff0c;所以跳表就是在正常链表的基础上添加了多步跳跃的指针。 什么是跳表 跳表&#xff08;Skip List&#xff09;是一种概率型的数据结构&am…

【自动驾驶汽车通讯协议】RGMII通信技术详解

文章目录 0. 前言1. RGMII概述1.1 RGMII说明1.2 RGMII作用&目的 2. RGMII的发展历史2.1 MII (Media Independent Interface)2.2 GMII (Gigabit Media Independent Interface)2.3 RGMII (Reduced Gigabit Media Independent Interface) 3. 架构设计3.1 接口信号3.2 信号时序…

浏览器选中文字样式

效果 学习 Chrome: 支持 ::selection。Firefox: 支持 :-moz-selection 和 ::selection。Safari: 支持 ::selection。Internet Explorer: 支持 :-ms-selection。Microsoft Edge: 支持 ::-ms-selection 和 ::selection。 代码 <!DOCTYPE html> <html lang"en&qu…

RAG实战:本地部署ragflow+ollama(linux)

1.部署ragflow 1.1安装配置docker 因为ragflow需要诸如elasticsearch、mysql、redis等一系列三方依赖&#xff0c;所以用docker是最简便的方法。 docker安装可参考Linux安装Docker完整教程&#xff0c;安装后修改docker配置如下&#xff1a; vim /etc/docker/daemon.json {…