Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore

news2024/10/5 19:11:40

没有基础的,请参考上一篇

彩蛋到最后一张图里找

参考链接

结果直接上图,没有任何业务代码

启动后,已经有了基本的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);
 }

 //默认Get
 public 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);
 }

 //默认GetList
 public 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());
 }
 //默认Post
 public 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所有的业务层,都有了,爽不爽啊,再也不用辛苦的做码农了。

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

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

相关文章

ClamAV:Linux服务器杀毒扫描工具

Clam AntiVirus&#xff08;ClamAV&#xff09;是免费而且开放源代码的防毒软件&#xff0c;软件与病毒码的更新皆由社群免费发布。ClamAV在命令行下运行&#xff0c;它不将杀毒作为主要功能&#xff0c;默认只能查出系统内的病毒&#xff0c;但是无法清除。需要用户自行对病毒…

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

记Kubernetes(k8s)初始化报错:“Error getting node“ err=“node \“k8s-master\“ not found“

记Kubernetes&#xff08;k8s&#xff09;初始化报错&#xff1a;"Error getting node" err"node \"k8s-master\" not found" 1、报错详情2、问题排查3、尝试问题解决 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#…

2003-2022年分国家、分行业、各省对外直接投资流量/存量/OFDI流量/OFDI存量(三份数据合集)

2003-2022年分国家、分行业、各省对外直接投资流量/存量/OFDI流量/OFDI存量 1、时间&#xff1a;更新至2022年&#xff0c;具体时间如下&#xff1a; 2003-2022年各省对外直接投资存量、省对外直接投资流量、省OFDI流量、省OFDI存量数据 2003-2022年中国对外直接投资流量、O…

halcon图像膨胀

1、原理&#xff1a; 使用结构元素在图像上移动&#xff0c;如果结构元素中有任意一个像素和图像上的非零像素重叠&#xff0c;则保留此时结构元素中心所在位置&#xff0c;并将其像素值设置为非零。 2、halcon代码 其中圆形结构元素可设置半径&#xff0c;矩形结构元素设置…

书生·浦语大模型第二期实战营(2)笔记作业

大模型部署 链接: 文档 链接: internstudio 1.部署 InternLM2-Chat-1.8B 模型进行智能对话 2.部署实战营优秀作品 八戒-Chat-1.8B 模型 3.通过 InternLM2-Chat-7B 运行 Lagent 智能体 Demo 4.实践部署 浦语灵笔2 模型 5.熟悉 huggingface 下载功能 from huggingface_hub im…

微信小程序使用textarea默认字数限制以及高度自适应和默认高度设置

<textarea model:value"{{text}}" auto-height placeholder"请输入内容" maxlength"-1" /> auto-height 设置自适应高度 设置之后高度设置无效 maxlength"-1" 解决默认最大字数限制 css // 文本域 textarea { border:…

【软考】系统集成项目管理工程师(二十二)法律法规【2分】

一、合同法 1、内容 当事人的名称或者姓名和住所、标的、数量、质量、价款或者报酬&#xff1b;履行期限、地点和方式&#xff1b;违约责任和解决争议的方法 练一练 【例1-高16下】格式条款是当事人为了重复使用而预先拟定&#xff0c;并在订立合同时未与对方协商的…

Python入门(八)

引入 引入函数 为了减少代码的冗余&#xff0c;减轻我们的工作量&#xff0c;我们常常将代码分块编写&#xff0c;在Python中更是如此&#xff0c;那么我们怎么在一个新的程序文件中调用我们已经编写好程序文件的函数&#xff0c;我们使用import。我们先写一个first.py为例语…

5G PLMN相关概念

PLMN PLMN&#xff08;Public Land Mobile Network&#xff0c;公用陆地移动网络&#xff09;&#xff0c;是由政府或其批准的经营者为公众提供陆地移动通信业务而建立、经营的网络。PLMN与公众交换电话网&#xff08;PSTN&#xff09;互连&#xff0c;形成整个地区或国家规模…

Verilog基础【二】

3.1 Verilog 连续赋值 关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; assign LHS_target RHS_expression &#xff1b;LHS&#xff08;left hand side&#xff09;…

java中:print与println的区别

目录 区别 区别 print是直接打印输出 println是输出后自动回车到下一行 例如 public class test {public static void main(String[] args){System.out.println("换行");System.out.print("不换行");System.out.println();}}——————————————…

STL容器的一些操作(常用的,不全)

目录 string 1.string的一些创建 2.string 的读入和输出&#xff1a; 3.string的一些操作 4.彻底清空string 容器的函数 vector 1.vector的一些创建&#xff1a; 2.vector的一些操作&#xff1a; 3.vector的彻底清空并释放内存&#xff1a; queue 循环队列&#xff1…

Mysql数据备份与恢复实战

文章目录 备份类型备份内容备份工具mysqldump备份 实战案例&#xff1a;恢复误删除的表准备工作2:30完全备份完全备份后更新数据表10:00误删students表需要恢复还原的状态开始还原恢复 为什么要备份&#xff1f; 备份是为了&#xff1a;灾难恢复&#xff1a;硬件故障、软件故障…

维安电子、费斯托中国等20+智能制造企业共探渠道管理数字化

近日&#xff0c;纷享销客新增长100人系列活动之制造业专场&#xff0c;我们有幸邀请维安电子、费斯托工具一起&#xff0c;共同探讨制造业渠道管理的新理念、新增长和新实践。 活动聚集了维安电子、费斯托工具、唐纳森、中科新松、斯可络、江浪科技、上海沪工等等20余位标杆制…

算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

针对 qt的sqlite加密数据库sqlitecipher插件QtCipherSqlitePlugin

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 简介编译安装使用可视化工具查看完结 简介 在客户端存储…

【docker】基础操作命令

docker run:干两步&#xff0c;本地找一下有没有集装箱&#xff0c;有运行&#xff0c;没有远程仓库下载运行。还没有报错。 docker好处&#xff1a; 不需要进行物理层模拟&#xff0c;不需要hypervisor利用的内核是宿主机的内核&#xff0c;不需要重新加载Linux内核 镜像相关…

QT-飞机水平仪图标

QT-飞机水平仪图标 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <stdio.h> #include <stdlib.h> #include <string.h>#include <QtCore> #include <QtGui> #include <QDebug> #include <QTableWidget&g…

刷题之动态规划-路径问题

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的题目了&#xff0c;要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是…