Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore
没有基础的,请参考上一篇
彩蛋到最后一张图里找
参考链接
结果直接上图,没有任何业务代码

启动后,已经有了基本的CRUD功能,还扩展了批量删除,与动态查询

动态查询截图,支持分页,排序


实现原理:
FreeSql导航参考官方地址
聚合根(实验室) | FreeSql 官方文档
继承IReadOnlyRepository接口,实现用FreeSql实现所有功能即可

关键CRUD代码
//默认删除public Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default){return FreeSql.Delete<T>(new { Id = id }).ExecuteAffrowsAsync(cancellationToken);}public Task DeleteDirectAsync(Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default){return FreeSql.Delete<T>().Where(predicate).ExecuteAffrowsAsync(cancellationToken);}//批量删除public Task DeleteManyAsync(IEnumerable<TKey> ids, bool autoSave = false, CancellationToken cancellationToken = default){return FreeSql.Delete<T>(ids).ExecuteAffrowsAsync(cancellationToken);}//默认Getpublic Task<T> GetAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default){object dywhere = new { Id = id };var query = FreeSql.GetAggregateRootRepository<T>().Select.WhereDynamic(dywhere);// FreeSql.Queryable<T>().WhereDynamic(dywhere); FreeSqlHelper.SetNavigate(query);return query.ToOneAsync(cancellationToken);}//默认GetListpublic Task<IQueryable<T>> GetQueryableAsync(){ISelect<T> queryable;if (_httpContextAccessor.HttpContext.Request.Query.Any(q => q.Key == "Sorting")){string sorting = _httpContextAccessor.HttpContext.Request.Query["Sorting"];queryable = FreeSql.Queryable<T>().OrderBy(sorting);}else{queryable = FreeSql.Queryable<T>();}FreeSqlHelper.SetNavigate(queryable);return Task.FromResult(queryable.AsQueryable());}//默认Postpublic async Task<T> InsertAsync(T entity, bool autoSave = false, CancellationToken cancellationToken = default){SetEntity(entity);await FreeSql.GetAggregateRootRepository<T>().InsertAsync(entity,cancellationToken);return entity;}
FreeSqlHelper.cs代码
public class FreeSqlHelper{/// <summary>/// 设置导航/// </summary>/// <typeparam name="T"></typeparam>/// <param name="query"></param>public static void SetNavigate<T>(FreeSql.ISelect<T> query) {var type= typeof(T);MemberInfo[] myMembers = type.GetProperties();foreach (MemberInfo myMember in myMembers){var navigateAttribute = myMember.GetCustomAttribute<FreeSql.DataAnnotations.NavigateAttribute>();if (navigateAttribute != null){query.IncludeByPropertyName(myMember.Name);}}}}
明细表id使用雪花漂移算法生成,引用Yitter.IdGenerator库(请自行nuget下载)
调用YitIdHelper.NextId()生成,没有数据库的自增字段功能,使用自增的问题很多

新增BaseCrudAppService类,代码直接从官方的CrudAppService里复制即可,利用批量替换,把CrudAppService替换为BaseCrudAppService
如图

新增FilterAsync与DeleteBulkAsync实现动态查询与批量删除功能

新增后的结果如图

freesql动态查询功能很强大,日期区间支持年,月,日期等,请参见下图示例说明

SearchCondition代码
public class SearchCondition{/// <summary>/// 动态过滤条件/// </summary>public DynamicFilterInfo FilterInfo { get; set; }=new();/// <summary>/// 当前页/// </summary>public int CurrentPage { get; set; } = 1;/// <summary>/// 每页显示记录条数/// </summary>public int PageSize { get; set; } = 50;/// <summary>/// 排序/// </summary>public string Sorting { get; set; } = string.Empty;}
IBaseRepository代码如图,只是为了在BaseCrudAppService能获取到freesql

Enum实体类代码,由代码生成器生成
[Serializable]
[Table("TSYS_Enum")]
public class Enum : BaseAuditedAggregateRoot<Guid>
{/// <summary>/// 字典群组/// </summary>public int EnumGroup { get; set; }/// <summary>/// 字典类型/// </summary>public int EnumType { get; set; } = 1;/// <summary>/// 字典代码/// </summary>[StringLength(100)]public string EnumCode { get; set; }/// <summary>/// 说明/// </summary>[StringLength(100)]public string EnumDesc { get; set; }/// 备注/// </summary>[StringLength(500)]public string Remark { get; set; }/// <summary>/// 数据状态 0:未提交,1:审核中,2:已审核/// </summary>public byte Status { get; set; }/// <summary>/// 禁用状态/// </summary>public byte ForbidStatus { get; set; }/// <summary>/// 禁用人/// </summary>public Guid? ForbidderId { get; set; }/// <summary>/// 禁用日期/// </summary>public DateTime? ForbidDate { get; set; }/// <summary>/// 审核人/// </summary>public Guid? ApproverId { get; set; }/// <summary>/// 审核日期/// </summary>public DateTime? ApproveDate { get; set; }[FreeSql.DataAnnotations.Navigate(nameof(EnumItem.EnumId))]public virtual List<EnumItem> Details { get; set; }
明细表实体类
[Serializable][Table("TSYS_EnumItem")]public class EnumItem : CreationAuditedEntity<long>{/// <summary>/// 主表key/// </summary>public Guid EnumId { get; set; }/// <summary>/// 显示值/// </summary>[StringLength(100)]public string EnumItemName { get; set; }/// <summary>/// 存储值/// </summary>[StringLength(100)]public string EnumItemValue { get; set; }/// <summary>/// 说明/// </summary>[StringLength(100)]public string EnumItemDesc { get; set; }/// <summary>/// 行号/// </summary>public int Num { get; set; } = 1;/// 备注/// </summary>[StringLength(500)]public string Remark { get; set; }/// <summary>/// 数据状态 0:未提交,1:审核中,2:已审核/// </summary>public byte Status { get; set; }/// <summary>/// 禁用状态/// </summary>public byte ForbidStatus { get; set; }/// <summary>/// 禁用人/// </summary>public Guid? ForbidderId { get; set; }/// <summary>/// 禁用日期/// </summary>public DateTime? ForbidDate { get; set; }/// <summary>/// 审核人/// </summary>public Guid? ApproverId { get; set; }/// <summary>/// 审核日期/// </summary>public DateTime? ApproveDate { get; set; }public virtual Enum Enum { get; set; } }
把原来的CrudAppService改为BaseCrudAppService即可,这样只要继承了BaseCrudAppService所有的业务层,都有了,爽不爽啊,再也不用辛苦的做码农了。


相关文章:
Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore
没有基础的,请参考上一篇 彩蛋到最后一张图里找 参考链接 结果直接上图,没有任何业务代码 启动后,已经有了基本的CRUD功能,还扩展了批量删除,与动态查询 动态查询截图,支持分页,排序 实现原理…...
yolov8直接调用zed相机实现三维测距(python)
yolov8直接调用zed相机实现三维测距(python) 1. 相关配置2. 版本一2.1 相关代码2.2 实验结果 3. 版本二3.1 相关代码3.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1.yolov5直接调…...
element跑马灯/轮播图,第一页隐藏左边按钮,最后一页隐藏右边按钮(vue 开箱即用)
图示: 第一步: <el-carousel :class"changeIndex0?leftBtnNone:changeIndeximgDataList.length-1? rightBtnNone:" height"546px" :autoplay"false" change"changeNext"><el-carousel-item v-for…...
下载及安装PHP,composer,phpstudy,thinkPHP6.0框架
文章目录 目录 文章目录 前言 一、下载PHP 二、下载composer 三、下载PHPstudy 四、下载think PHP 1.下载 2.多应用开发 前言 thinkPHP是一款开源的PHP框架,它是基于MVC(Model-View-Controller)设计模式构建的。thinkPHP提供了丰富的…...
volatile使用场景总结
volatile关键字在Java中用于确保变量的可见性以及防止指令重排序,特别是在没有使用锁定机制时对变量进行读写的多线程环境中。以下是需要使用volatile修饰的一些场景: 确保变量的可见性 当一个变量被多个线程访问,且至少有一个线程在写&…...
AcWing 1413. 矩形牛棚(每日一题)
原题链接:1413. 矩形牛棚 - AcWing题库 作为一个资本家,农夫约翰希望通过购买更多的奶牛来扩大他的牛奶业务。 因此,他需要找地方建立一个新的牛棚。 约翰购买了一大块土地,这个土地可以看作是一个 R 行(编号 1∼R&…...
macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载
macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨,macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题,并修…...
WPF使用外部字体,思源黑体,为例子
1.在工程中新建文件夹,命名为“Font"。 2.将下载好的字体文件复制到Font文件夹。 3.在工程中,加入静态资源 <Window.Resources><FontFamily x:Key"SYBold">/AnalyzeImage;Component/Font/#思源黑体 CN Bold</FontFamily…...
9、jenkins微服务持续集成(一)
文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…...
VOC(客户之声)赋能智能家居:打造个性化、交互式的未来生活体验
随着科技的飞速发展,智能家居已成为现代家庭不可或缺的一部分。然而,如何让智能家居更好地满足用户需求,提供更贴心、更智能的服务,一直是行业关注的焦点。在这个背景下,VOC(客户之声)作为一种用…...
时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测
时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测(完整源码和数据…...
node.js学习(2)
版权声明 以下文章为尚硅谷PDF资料,B站视频链接:【尚硅谷Node.js零基础视频教程,nodejs新手到高手】仅供个人学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,…...
【pytest】测试数据存储在 Excel 或 TXT 文件中,如何参数化
如果测试数据存储在 Excel 或 TXT 文件中,你可以使用外部库来读取这些数据,并将其转化为参数化测试所需的格式。下面我将分别展示如何从这两种文件中读取数据,并用于参数化测试。 从 Excel 文件中读取测试数据 你可以使用 pandas 库来读取 …...
ubuntu22.04@Jetson Orin Nano安装配置VNC服务端
ubuntu22.04Jetson Orin Nano安装&配置VNC服务端 1. 源由2. 环境3. VNC安装Step 1: update and install xserver-xorg-video-dummyStep 2: Create config for dummy virtual displayStep3: Add the following contents in xorg.conf.dummyStep 4: Update /etc/X11/xorg.con…...
面向对象特征二:继承
继承的概述 生活中的继承 财产继承: 绿化:前人栽树,后人乘凉 “绿水青山,就是金山银山” 样貌: 继承之外,是不是还可以"进化": 继承有延续(下一代延续上一代的基因、财…...
宝塔面板CentOS Stream 8 x86 下如何安装openlitespeed
宝塔自带的软件商店里如果没办法安装,那么我们可以通过指令来手动安装: 第一步: yum install epel-release Package epel-release-8-19.el8.noarch is already installed. Dependencies resolved. Nothing to do. Complete! 第二步&#…...
LeetCode 2952.需要添加的硬币的最小数量:贪心(排序)
【LetMeFly】2952.需要添加的硬币的最小数量:贪心(排序) 力扣题目链接:https://leetcode.cn/problems/minimum-number-of-coins-to-be-added/ 给你一个下标从 0 开始的整数数组 coins,表示可用的硬币的面值ÿ…...
基于SpringBoot + Vue实现的在线装修管理系统设计与实现+毕业论文
介绍 系统包含用户、装修队、管理员三个角色 管理员: 管理员管理:管理其他管理员的账号和权限,确保系统管理的层次化和安全性。 装修队管理:审核装修队的资质,管理装修队的人员信息,监控工程进度ÿ…...
阿里云安全产品简介,Web应用防火墙与云防火墙产品各自作用介绍
在阿里云的安全类云产品中,Web应用防火墙与云防火墙是用户比较关注的安全类云产品,二则在作用上并不是完全一样的,Web应用防火墙是一款网站Web应用安全的防护产品,云防火墙是一款公共云环境下的SaaS化防火墙,本文为大家…...
作业 二维数组-定位问题
图形相似度 描述 给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。 说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。 两幅图像的相似度定义为相同像素点数占总像素点数…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
