Web开发:ORM框架之Freesql的入门和技巧使用小结

news2025/3/11 6:41:49

目录

零、官网链接

一、字段映射表

二、查询

1.freesql独特封装:between关键字

 2.分页(每页 20 条数据,查询第 1 页)

3.Withsql(子查询,不建议)

3.简单查询、映射查询

4.参数查询、自定义查询

5.左外连接(框架+导航属性)

6.简单分表查询

三、增删改

1.SQL增删改

 2.框架增删改(普通)

3.框架保存逻辑

四、demo

1.Model

2.Main


零、官网链接

https://freesql.net/guide/

一、字段映射表

访问官网

二、查询

1.freesql独特封装:between关键字查日期

var list = list.Where(a => a.Time.Between(time1, time2));

 2.分页(每页 20 条数据,查询第 1 页)

var list = fsql.Select<Topic>()
    .Where(a => a.Id > 10)
    .Count(out var total) //总记录数量
    .Page(1, 20)
    .ToList();

3.Withsql(子查询,不建议)

class Topic
{
    [Column(IsIdentity = true)]
    public int Id { get; set; }
    public string Title { get; set; }
    public int Clicks { get; set; }
    public DateTime CreateTime { get; set; }

    public int CategoryId { get; set; }
}

fsql.Select<Topic>()
    .WithSql("select * from Topic where clicks > @val", new { val = 10 })
    .Page(1, 10)
    .ToList()
//SELECT a.`Id`, a.`Clicks`, a.`CategoryId`, a.`Title`, a.`CreateTime` 
//FROM (select * from Topic where clicks > @val) a 

3.简单查询、映射查询

【技巧】打印sql、纠正映射

List<Student2022> list1 = freesql.Select<Student2022>().ToList(); //1.简单查询

//var sql1 = freesql.Select<Student2022>().ToSql();//【技巧】获取查询SQL

List<StuAndParent> list5 = freesql.Select<Student2022>().ToList<StuAndParent>();//2.查询后自动映射
//freesql.Select<Student2022>().ToList(x => new StuAndParent { xxx = x.id }) //【技巧】纠正映射

4.参数查询、自定义查询

//等于=、批量in、模糊like查询
freesql.Ado.QuerySingle<T>("select * from t1 where id = @id", new { id = 1 });//同时支持字典查询
freesql.Ado.Query<T>("select * from t1 where name like @name", new { name = "%" + searchText + "%" });//同时支持字典查询
var ids = new int[] { 1, 2, 3 };
List<T> list = freesql.Ado.Query<T>("select * from t1 where id in @ids", new { ids = ids });//仅支持 Array 和 IList 类型


List<StuAndParent> list2 = freesql.Ado.Query<StuAndParent>("SELECT * FROM Student_2022 A LEFT JOIN Parent B ON A.id=B.pid");//3.自定义SQL查询

5.左外连接(框架+导航属性)

List<StuAndParent> list2 = freesql.Ado.Query<StuAndParent>("SELECT * FROM Student_2022 A LEFT JOIN Parent B ON A.id=B.pid");//3.自定义SQL查询

List<StuAndParent> list3 = freesql.Select<Student2022, Parent>()//4.左外连接(框架,列出具体字段)
             .LeftJoin(w => w.t1.id == w.t2.pid)
             .ToList(w => new StuAndParent
             {
                 id= w.t1.id,
                 name = w.t1.name,
                 pid = w.t2.pid,
                 pname = w.t2.pname
             });

  List<StuAndParent> list3_1 = freesql.Select<Student2022, Parent>()//5.左外连接(框架,映射结果)
             .LeftJoin(w => w.t1.id == w.t2.pid)
             .ToList(x=>new StuAndParent());

  List<StuAndParent> list4 = freesql.Select<Student2022>()  //6.左外连接(导航属性)
                      .LeftJoin<Parent>((student, parent) => student.id == parent.pid)//直接设置关联条件
                      .ToList(x=>new StuAndParent());//转化为StuAndParent实体
    [Table(Name = "Student_2022")]
    public class Student2022
    {
        [Column(IsPrimary = true)]
        public int id { get; set; }

        public string name { get; set; }


        public int? ParentId { get; set; }  // 【导航关联字段】(数据库不需要设置外键,但数据库必须要有这个字段)

        [Navigate(nameof(ParentId))]  // 设置导航属性,指定【导航关联字段】
        public Parent Parent { get; set; }  // 关联的 Parent 实体

    }

    public class Parent
    {
        [Column(IsPrimary = true)]
        public int pid { get; set; }

        public string pname { get; set; }

        [Navigate(nameof(Student2022.ParentId))]  // 设置导航属性,指定【导航关联字段】
        public Student2022 Student { get; set; }  // 关联的 Student2022 实体
    }

    public class StuAndParent
    {
        public int id { get; set; }
        public string name { get; set; }
        public int pid { get; set; }
        public string pname { get; set; }
    }

6.简单分表查询

//7.简单分表查询
var list6 = freesql.Select<Teacher>().ToList();
    //假如是按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "createtime=2022-1-1(1 month)")]注意:①需包含log_202201这张表 ②递增规律是一个月一次,确保他们存在。 ③确保有字段createtime。
    [Table(Name = "Teacher_{yyyy}", AsTable = "time=2023-1-1(1 year)")]
    public class Teacher
    {
        [Column(IsPrimary = true)]
        public int id { get; set; }

        public DateTime time { get; set; }
    }

三、增删改

1.SQL增删改(ADO.NET)

//8.sql增删改
bool b = freesql.Ado.ExecuteNonQuery(@"DELETE FROM Student_2022 WHERE id = 6")>0; 

 2.框架增删改(普通)

//9.框架增删改
freesql.Insert(entity).ExecuteAffrows();

freesql.Update<T>(entity);
freesql.Update<T>()
    .Set(a => a.Title, "新标题")
    .Set(a => a.Time, DateTime.Now)
    .Where(a => a.Id == 1)//过滤条件
    .ExecuteAffrows();

freesql.Delete<T>(entity).ExecuteAffrows();
freesql.Delete<T>()
    .Where(s => s.Id == 1)
    .ExecuteAffrows();

3.框架保存逻辑

【判断依据】主键存在=>改,主键不存在=>增

//10.保存实体(增加或修改)
var entity = new Student2022 { name = "晓晓", id = 6 };
bool b2 = freesql.InsertOrUpdate<Student2022>()
                    .SetSource(entity) 
                    .ExecuteAffrows()>0;

四、demo

1.Model

using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FreesqlDemo
{
    public class Model
    {
    }

    [Table(Name = "Student_2022")]
    public class Student2022
    {
        [Column(IsPrimary = true)]
        public int id { get; set; }

        public string name { get; set; }


        public int? ParentId { get; set; }  // 【导航关联字段】(数据库不需要设置外键,但数据库必须要有这个字段)

        [Navigate(nameof(ParentId))]  // 设置导航属性,指定【导航关联字段】
        public Parent Parent { get; set; }  // 关联的 Parent 实体

    }

    public class Parent
    {
        [Column(IsPrimary = true)]
        public int pid { get; set; }

        public string pname { get; set; }

        [Navigate(nameof(Student2022.ParentId))]  // 设置导航属性,指定【导航关联字段】
        public Student2022 Student { get; set; }  // 关联的 Student2022 实体
    }

    public class StuAndParent
    {
        public int id { get; set; }
        public string name { get; set; }
        public int pid { get; set; }
        public string pname { get; set; }
    }

    //假如是按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "createtime=2022-1-1(1 month)")]注意:①需包含log_202201这张表 ②递增规律是一个月一次,确保他们存在。 ③确保有字段createtime。
    [Table(Name = "Teacher_{yyyy}", AsTable = "time=2023-1-1(1 year)")]
    public class Teacher
    {
        [Column(IsPrimary = true)]
        public int id { get; set; }

        public DateTime time { get; set; }
    }
}

2.Main

using FreeSql;
using System.Diagnostics;
using System.Net.WebSockets;
using System.Reflection.Metadata;
using static FreeSql.Internal.GlobalFilter;

namespace FreesqlDemo
{
    public class Program
    {

        // 修正后的静态字段声明
        private static IFreeSql freesql = new FreeSqlBuilder()
            .UseMonitorCommand(cmd => Trace.WriteLine($"Sql:{cmd.CommandText}"))
            .UseConnectionString(DataType.SqlServer, @"server = DESKTOP-FTH2P3S; Database = Test; Trusted_Connection = SSPI;")
            .Build();


        static void Main(string[] args)
        {
            List<Student2022> list1 = freesql.Select<Student2022>().ToList(); //1.简单查询

            var sql1 = freesql.Select<Student2022>().ToSql();//【技巧】获取查询SQL

            List<StuAndParent> list5 = freesql.Select<Student2022>().ToList<StuAndParent>();//2.查询后自动映射
            //freesql.Select<Student2022>().ToList(a => new StuAndParent { xxx = a.ext }) //【技巧】纠正映射

            //等于=、批量in、模糊like查询
            //freesql.Ado.QuerySingle<T>("select * from t1 where id = @id", new { id = 1 });//同时支持字典查询
            //freesql.Ado.Query<T>("select * from t1 where name like @name", new { name = "%" + searchText + "%" });//同时支持字典查询
            //var ids = new int[] { 1, 2, 3 };
            //List<T> list = freesql.Ado.Query<T>("select * from t1 where id in @ids", new { ids = ids });//仅支持 Array 和 IList 类型


            List<StuAndParent> list2 = freesql.Ado.Query<StuAndParent>("SELECT * FROM Student_2022 A LEFT JOIN Parent B ON A.id=B.pid");//3.自定义SQL查询

            List<StuAndParent> list3 = freesql.Select<Student2022, Parent>()//4.左外连接(框架,列出具体字段)
                       .LeftJoin(w => w.t1.id == w.t2.pid)
                       .ToList(w => new StuAndParent
                       {
                           id= w.t1.id,
                           name = w.t1.name,
                           pid = w.t2.pid,
                           pname = w.t2.pname
                       });

            List<StuAndParent> list3_1 = freesql.Select<Student2022, Parent>()//5.左外连接(框架)
                       .LeftJoin(w => w.t1.id == w.t2.pid)
                       .ToList(x=>new StuAndParent());

            List<StuAndParent> list4 = freesql.Select<Student2022>()  //6.左外连接(导航属性)
                                .LeftJoin<Parent>((student, parent) => student.id == parent.pid)//直接设置关联条件
                                .ToList(x=>new StuAndParent());//转化为StuAndParent实体

            //7.简单分表查询
            var list6 = freesql.Select<Teacher>().ToList();

            //8.sql增删改
            bool b = freesql.Ado.ExecuteNonQuery(@"DELETE FROM Student_2022 WHERE id = 6")>0;

            //9.框架增删改
            //freesql.Insert(entity).ExecuteAffrows();

            //freesql.Update<T>(entity);
            //freesql.Update<T>()
            //    .Set(a => a.Title, "新标题")
            //    .Set(a => a.Time, DateTime.Now)
            //    .Where(a => a.Id == 1)//过滤条件
            //    .ExecuteAffrows();

            //freesql.Delete<T>(entity).ExecuteAffrows();
            //freesql.Delete<T>()
            //    .Where(s => s.Id == 1)
            //    .ExecuteAffrows();

            //10.保存实体(增加或修改)
            var entity = new Student2022 { name = "晓晓", id = 6 };
            bool b2 = freesql.InsertOrUpdate<Student2022>()
                                .SetSource(entity) 
                                .ExecuteAffrows()>0;

        }
    }
}

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

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

相关文章

RK3568笔记五十六:yolov8_obb旋转框训练部署

若该文为原创文章,转载请注明原文出处。 本文基于rknn_model_zoo和山水无移大佬的博客和代码训练模型并部署到正点原子的ATK-DLRK3568板子测试。 https://github.com/ultralytics/ultralytics 一、训练 1、环境搭建 使用的是AUTODL环境,yolov8-obb数据集不大,也可以使用c…

NIO中的异步—ChannelFuture、CloseFuture以及异步提升在NIO中的应用

ChannelFuture 客户端调用connect后返回值为ChannelFuture对象&#xff0c;我们可以利用ChannelFuture中的channel()方法获取到Channel对象。 由于上述代为为客户端实现&#xff0c;若想启动客户端实现连接操作&#xff0c;必须编写服务端代码&#xff0c;实现如下&#xff1a;…

TCP协议为什么是三次握手和四次挥手

1.一次握手&&二次握手 一次握手就能成功的话&#xff0c;也就代表着不需要进行确认&#xff0c;那么万一有恶意的服务器一直发送SYN&#xff0c;而服务器需要维护大量的连接&#xff0c;维护连接又需要成本&#xff0c;那么就很容易引发SYN洪水&#xff0c;导致服务器…

Linux中的exec族函数

exec 系列函数用于替换当前进程的用户空间代码和数据&#xff0c;从而执行一个新的程序。调用 exec 系列函数不会创建新的进程&#xff0c;但会用新程序的代码和数据替换当前进程&#xff0c;因此调用 exec 后&#xff0c;进程的 ID 保持不变&#xff0c;但进程的行为变为执行新…

计算机毕业设计 教师科研管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

第1章-05-通过浏览器控制台安装JQuery.js库

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲。 🎉欢迎 👍点赞✍评论⭐收…

大数据背景下基于Python语言的单车租赁商业数据可视化分析

注&#xff1a;源码在最后&#xff0c;只是一次实验记录,不足之处请指教。 一 研究背景及意义 在大数据时代&#xff0c;商业领域的数据量迅速增长&#xff0c;如何有效地利用这些数据成为企业决策和优化成为重要的研究课题。单车租赁作为一种新兴的共享经济模式&#xff0c;其…

健韵坊(详细项目实战一)Spring系列 + Vue3

这一次来一个项目改造的项目实战&#xff0c;基于很久之前的一个demo项目&#xff0c;来实现一个改造优化和部署上线的项目实战。&#xff08;就当是接手*山项目并且加以改造的一个实战吧。&#xff09; 之前是一个关于运动的一个项目&#xff08;其实之前连名字都没想好hhhh&…

vue3 响应式 API:watch()、watchEffect()

watch() 基本概念 watch()用于监视响应式数据的变化&#xff0c;并在数据变化时执行相应的回调函数。可以监视单个响应式数据、多个响应式数据的组合&#xff0c;或者一个计算属性。 返回值 返回一个函数&#xff0c;调用这个函数可以停止监视。 特点 watch() 默认是懒侦听的&…

【Linux网络】select函数

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 select函数介绍select函数参数介绍select函数返回值select的工作流程TCP服务器【多路复用版】 select函数介绍 在Linux网络编程中&#xff0c;select 函数是一种非常有用的IO多路复用技术&#xff0…

秃姐学AI系列之:LeNet + 代码实现

目录 LeNet MNIST数据集 LeNet模型图 ​编辑 总结 代码实现&#xff1a;卷积神经网络 LeNet LeNet&#xff08;LeNet-5&#xff09;由两个部分组成&#xff1a;卷积编码器核全连接层密集块 检查模型 LeNet 卷积神经网络里面最为著名的一个网络&#xff0c;80年代末提出…

【vue教程】七. Vue 的动画和过渡

文章目录 往期列表回顾本章涵盖知识点Vue 的内置动画系统基本的进入和离开过渡列表过渡 CSS 过渡CSS 过渡基础Vue 中的 CSS 过渡 JavaScript 动画使用 JavaScript 钩子 第三方动画库的使用集成 Animate.css 实例演示创建一个简单的动画应用 结语 往期列表 【vue教程】一. 环境…

iOS18升级出现白苹果、无法重启等问题,要怎么解决

随着苹果iOS 18系统beta版本的推出&#xff0c;不少用户在私信说升级后遇到了白苹果和无法重启等问题。这些问题不仅影响了大家的正常使用&#xff0c;还会导致数据丢失和系统崩溃。本文将详细介绍iOS 18升级后出现白苹果、无法重启等问题的原因及解决方法&#xff0c;帮助大家…

日期转时间濯

tfunction(date_str) local code ,time World:getTimeFromDateString(date_str) return time/(60*60*24) end print(t(2024-08-16)-t(2024-08-3))

指针 (四)

一 . 指针的使用和传值调用 &#xff08;1&#xff09;strlen 的模拟实现 库函数 strlen 的功能是求字符串长度&#xff0c;统计的是字符串中 \0 之前的字符个数&#xff0c;函数原格式如下&#xff1a; 我们的参数 str 接收到一个字符串的起始地址&#xff0c;然后开始统计…

JS 获取当前操作系统类型

在JavaScript中&#xff0c;‌直接获取用户的操作系统信息是不可能的&#xff0c;‌因为JavaScript主要运行在浏览器中&#xff0c;‌而浏览器出于安全和隐私的考虑&#xff0c;‌不会提供访问操作系统详细信息的API。‌ 但是&#xff0c;‌你可以通过分析用户代理字符串&…

数据库性能定位-慢sql定位、sql优化(docker容器实战)

安装好mysql数据之后&#xff0c;创建库的时候&#xff0c;要注意选择 字符集编码。如果没有选择好&#xff0c;你的库表存中文的时候&#xff0c;会字符集乱码。选择utf8mb4. 建表的时候&#xff0c;存储引擎 InnoDB、MyISAM mysql5.7及以后数据库&#xff0c;表的默认存储引…

官方招募 | 仓颉语言三方库社区建设全速启航,全球开发者、技术大神只等您!

Cangjie-TPC招募令 仓颉社区的小伙伴们&#xff0c;官方三方库&#xff08;Cangjie-TPC&#xff09;招募开始啦&#xff01; Cangjie-TPC&#xff08;https://gitcode.com/Cangjie-TPC&#xff09; 是 Cangjie 社区用于汇集基于仓颉编程语言开发的开源三方库的主干仓&#xf…

JS获取当前浏览器名称

在JavaScript中&#xff0c;获取当前浏览器名称的方法并不是一个标准的功能&#xff0c;因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是&#xff0c;你可以通过分析用户代理字符串&#xff08;User-Agent&#xff09;来推断出浏览器的名称。 以下是一个简单的…

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据&#xff0c;一个为投影坐标系&#xff0c;另一个为地理坐标系时&#xff0c;在GIS软件中位置无法叠加到一起&#xff0c;这需要将两个或多个数据的坐标系统一&#xff0c;可以直接将地理坐标系的数据进行投影&#xff0c;或将投影坐标系转为地理坐标系。下面介绍…