PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】
前言
PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[]/varchar[]/numeric[]/timestamp[] 数组类型、hstore 类型(类似 c# Dictionary<string, string>)、gis 类型。
选择一项技术一定是可以帮助我们提升效率,并且使用一定是非常简便的,才能让我们赚取更多时间,早点下班甚至上班摸鱼。这篇文章主要讲数组类型,如何与 FreeSql 打出简便高效的【组合拳】。
PostgreSQL 可以为每一种类型创建数组,比如 int4 对应的数组类型是 int4[]、varchar 对应的数据类型是 varchar[]。
PostgreSQL 虽然支持多维数组,但是不建议使用,因为实际使用中会带来很多操作麻烦,违背了使用简便的初衷。一维数组足够应付很多场景。
issues #1145
Feature 特性:对数组做导航
简要描述原因:pg 之类的数据库支持数组类型,但是没有对数组做导航支持
使用场景:避免无必要的中间表
class User
{
public int[] RoleIds { get; set; }
public Role[] Roles { get; set; }
}
class Role
{
public int Id { get; set; }
}
解决方案
经过多方需求讨论之后,设定了【功能目标】如下:(已发布版本 v3.2.666-preview20220606)
功能名称:PostgreSQL 【数组类型】的【导航属性】专属功能
public enum TableRefType
{
OneToOne, ManyToOne, OneToMany, ManyToMany,
PgArrayToMany //PgArray 专用导航类型
}
方式一:select * from Role where Id in (RoleIds)
class User
{
public int[] RoleIds { get; set; }
[Navigate(nameof(RoleIds))]
public List<Role> Roles { get; set; }
}
方式二:select * from User where RoleIds @> ARRAY[Id]::int4[]
class Role
{
public int Id { get; set; }
[Navigate(nameof(User.RoleIds))]
public List<User> Users { get; set; }
}
1、支持 LazyLoading 延时加载
2、支持 IncludeMany、IncludeByPropertyName 贪婪加载
fsql.Select<User>().IncludeMany(a => a.Roles).ToList();
fsql.Select<User>().IncludeByPropertyName("Roles").ToList();
fsql.Select<Role>().IncludeMany(a => a.Users).ToList();
fsql.Select<Role>().IncludeByPropertyName("Users").ToList();
3、支持 Lambda 子查询
fsql.Select<User>().Where(a => a.Roles.Any(b => b.RoleName == "管理员")).ToList();
fsql.Select<User>().Where(a => a.Roles.Count() > 0).ToList();
fsql.Select<Role>().Where(a => a.Users.Any(b => b.UserName == "Admin")).ToList();
fsql.Select<Role>().Where(a => a.Users.Count() > 0).ToList();
//... 以及 AsSelect()
4、不支持级联保存、级联删除(因机制冲突)
资料补充
FreeSql 导航属性进化过程 OneToOne/ManyToOne/OneToMany/ManyToMany/Parent(文章内不包括 PgArrayToMany 介绍)
FreeSql 是 .Net ORM,能支持 .NetFramework4.0+、.NetCore、Xamarin、XAUI、Blazor、以及还有说不出来的运行平台,因为代码绿色无依赖,支持新平台非常简单。目前单元测试数量:5000+,Nuget下载数量:180K+,源码几乎每天都有提交。
QQ群:4336577(已满)、8578575(在线)、52508226(在线)
FreeSql 主要优势在于易用性上,基本是开箱即用,在不同数据库之间切换兼容性比较好。作者花了大量的时间精力在这个项目,肯请您花半小时了解下项目,谢谢。功能特性如下:
- 支持 CodeFirst 对比结构变化迁移;
- 支持 DbFirst 从数据库导入实体类;
- 支持 丰富的表达式函数,自定义解析;
- 支持 批量添加、批量更新、BulkCopy;
- 支持 导航属性,贪婪加载、延时加载、级联保存;
- 支持 读写分离、分表分库,租户设计;
- 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/神通/人大金仓/翰高/MsAccess;
FreeSql 使用非常简单,只需要定义一个 IFreeSql 对象即可:
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, connectionString)
.UseAutoSyncStructure(true) //自动同步实体结构到数据库
.Build(); //请务必定义成 Singleton 单例模式
注意:单例不等于线程不安全,除了事务,实际内部是有连接池管理 Ado.net IDbConnection 对象,请放心大胆使用,不用纠结线程安全问题。
微软制造了优秀的语言 c#,利用语言特性可以做一些非常好用的功能,在 ORM 中使用导航属性非常适合。
ManyToOne(N对1) 提供了简单的多表 join 查询;
OneToMany(1对N) 提供了简单可控的级联查询、级联保存功能;
ManyToMany(多对多) 提供了简单的多对多过滤查询、级联查询、级联保存功能;
Parent(父子关系) 提供了常用的 CTE查询、删除、递归功能;
PgArrayToMany(数组导航) 提供了 pgsql array 数组类型级联查询;
希望正在使用的、善良的您能动一动小手指,把文章转发一下,让更多人知道 .NET 有这样一个好用的 ORM 存在。谢谢了!!
FreeSql 开源协议 MIT https://github.com/dotnetcore/FreeSql,可以商用,文档齐全。QQ群:4336577(已满)、8578575(在线)、52508226(在线)
如果你有好的 ORM 实现想法,欢迎给作者留言讨论,谢谢观看!
PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】的更多相关文章
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
- 数据类型总结——Array(数组类型)
相关文章 简书原文:https://www.jianshu.com/p/1e4425383a65 数据类型总结——概述:https://www.cnblogs.com/shcrk/p/9266015. ...
- PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...
- 多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量
多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量,并且数组变量可以直接取到每一个元素var array1 = '<%=yearList =>'; ...
- PHP-Manual的学习----【语言参考】----【类型】-----【array数组】
1.Array 数组 PHP 中的 数组 实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是 ...
- JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的
Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...
- mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler
mybatis 比 ibatis 改进了很多,特别是支持了注解,支持了plugin inteceptor,也给开发者带来了更多的灵活性,相比其他ORM,我还是挺喜欢mybatis的. 闲言碎语不要讲, ...
- PostgreSQL 的字段类型和表操作笔记
字段类型 数值类型 Name Storage Size Description Range smallint 2 bytes small-range integer -32768 to +32767 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
随机推荐
- oracle 多列求和
第一种: select sum(decode(count1,null,0,count1) +decode(count2,null,0,count2) +decode(count3,null,0,cou ...
- 小程序wx.previewImage查看图片再次点击返回时重新加载页面问题
wx.previewImage预览图片这个过程到底发生了什么? 首先我们点击图片预览,附上查看图片代码: <image class="headImg" data-src=&q ...
- Exchange日志
Exchange日志是exchange的重要组成部分,也是管理exchang的重要指标.exchange日志产生的速度很快,而且会占用大量磁盘空间.如何管理日志成为exchange管理员的重要管理任务 ...
- 文档声明(Doctype)和<!Doctype html>有何作用? 严格模式与混杂模式如何区分?它们有何意义?
文档声明的作用: 文档声明是为了告诉浏览器,当前HTML文档使用什么版本的HTML来写的,这样浏览器才能按照声明的版本来正确的解析. <!doctype html> 的作用就是让浏览器进入 ...
- Typora 设置图片自动上传
使用 PicGo-Core(command line) 下载 PicGo-Core 依次点击 文件 -> 偏好设置 -> 图像 来到下图所示界面: 点击①位置选择 PicGo-Gore(c ...
- SpringMVC的数据响应方式-页面跳转
1.返回字符串形式 直接返回字符串:此种方式会返回字符串与视图解析器的前后缀拼接后跳转 有关视图解析器的拼接请访问此地址 注意:WEB-INF下的资源一般不能访问,因为转发是服务器的操作所以可以访问到 ...
- IDEA出现Error during artifact deployment. See server log for details.
第一步查看配置 然后点击Web Application Exploded->from Module, 如果以上问题都不存在,则要检查lib下是否缺少相应的jar包,是否导入,是否jar包过多产生 ...
- TNS-12533: TNS:illegal ADDRESS parameters(修复)
修复 TNS-12533: TNS:illegal ADDRESS parameters oracle@prd:/home/oracle$sqlplus sys/abc@fp as sysdba SQ ...
- Rb(redis blaster),一个为 redis 实现 non-replicated 分片的 python 库
Rb,redis blaster,是一个为 redis 实现非复制分片(non-replicated sharding)的库.它在 python redis 之上实现了一个自定义路由系统,允许您自动定 ...
- pycharm的安装指导教程以及破解
第一步:下载 下载网址:https://www.jetbrains.com/pycharm/download/#section=windows 根据自己的操作系统选择,然后点击download就开始下 ...