.NET 6 跨服务器联表查询操作MySql、Oracle、SqlServer等相互联表

目录
  • 一、大家是否有这个需求
  • 二、 多库架构ORM
  • 三、跨服务器跨库联表查询
    • 3.1 跨库查询之一对一
    • 3.2 跨库查询之一对多
    • 3.3 跨库查询之多对多  
    • 3.4 多个表查询我们可以这么写
    • 3.5 手动指定多库
    • 3.6是否有性能问题

.NET 6 跨服务器联表查询, MySql、Oracle、SqlServer等相互联表

一、大家是否有这个需求

1.跨品种查询 :比如 MYSQL和一个SQLSERVER进行联表查询 ,或者SQLITE和MYSQL进行联表查询

2.跨服务器查询 : A服务器和B服务器查询

如果想同时支持1和2 相信很多人都没有比较好的解决方案

我的设计是通过多库架构来实现多库操作

二、 多库架构ORM

什么是多库架构ORM,一个对象可以同时操作和管理多个数据库 我们称为多库架构

EF Core

一个对象只能操作一个数据库,所以EF Core不能称为多库架构,只能称为支持多种数据库,如果要实现多库

我们就需外部封装,代码如下

SqlSugar

SqlSugar在2017最火的时候停更了一年半,最大的原因就是因为底层架构影响了SqlSugar的上限,历史遗留问题太多

需要大量重构,如果直接更新对现有用户是不负责的,所以我选择了一年半未更新,让不是特别热爱SqlSugar的用户

先用其他框架,留下对于SqlSugar一直热衷的用户,能支持和一起完善SqlSugar的用户,谢谢有一群这样的用户不离不弃

筹划了一年半的时间终于在2020开始进行重构 每隔一个月就重构一部分 加点功能 , 直到今天终于重构完成

代码如下:

var db = new SqlSugarClient(new List<ConnectionConfig>()
{
 new ConnectionConfig(){ConfigId="0",DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection=true},
 new ConnectionConfig(){ConfigId="1",DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection=true  }
});

 if(!db.IsAnyConnection(configId))//当前上下文不存在则添加
    db.AddConnection(new ConnectionConfig{
                           DbType = DbType.SqlServer,ConfigId = "1",
                IsAutoCloseConnection = true,
                ConnectionString = 。。 });
//开启事务
try {
 //db我们称为主Db
 db.BeginTran(); //开启多库 (db.Ado.BeginTran是单库事务)事务支持单库和多库

 db.GetConnection("1").Insertable(new Order()//var childDb=db.GetConnection(1);我们称为子DB,子DB不具有租户方法,具有单当库操作方法
 {
   CreateTime = DateTime.Now,
   CustomId = 1,
   Name = "a",
   Price = 1
 }).ExecuteCommand();

 db.GetConnection("2").Insertable(new Order()
 {
   CreateTime = DateTime.Now,
   CustomId = 1,
   Name = "a",
   Price = 1
 }).ExecuteCommand();

 //提交事务
 db.CommitTran(); 

}
catch(Exception ex)
{
  //回滚事务
  db.Rollback();
}

多库架构可以在底层做到兼容,比如事务不需要引用外部DLL,比如我可以让底层语法支持多库,像EF CORE你能改他的

Include 语法吗?改不了,我只能封装他的语法,或者添加扩展方法。

三、跨服务器跨库联表查询

SqlSugar来实现跨服务器联表查询

3.1 跨库查询之一对一

[Tenant("db2")]//在类的特性设置当前类属于哪个库
  public class OrderItem
 {
            [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
            public int ItemId { get; set; }
            public int OrderId { get; set; }
            public decimal? Price { get; set; }
            [SqlSugar.SugarColumn(IsNullable = true)]
            public DateTime? CreateTime { get; set; }
            [Navigate(NavigateType.OneToOne,nameof(OrderId))] //设置关系 对应Order表主键
            public Order Order { get; set; }
 }
//通过ConfigId进行区分是哪个库
var db = new SqlSugarClient(new List<ConnectionConfig>()
{
  new ConnectionConfig(){ConfigId="db1",DbType=DbType.Sqlite,ConnectionString="DataSource=/Db_OrderDb.sqlite",IsAutoCloseConnection=true},
  new ConnectionConfig(){ConfigId="db2",DbType=DbType.Sqlite,ConnectionString="DataSource=/Db_OrderItemDb.sqlite",IsAutoCloseConnection=true }
});

//通过实体类特性[Tenant("db2")]自动映射不同数据库进行查询
var list=db.QueryableWithAttr<OrderItem>()
.Includes(z => z.Order)
.ToList(); //1行代码就搞定了2个库联表查询

3.2 跨库查询之一对多

[Tenant("db1")]//指定是db1  (OrderItem类设置为 db2)
 public class Order
 {
           [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
           public int Id { get; set; }
           public string Name { get; set; }
           public decimal Price { get; set; }
           [SugarColumn(IsNullable = true)]
           public DateTime CreateTime { get; set; }
           [SugarColumn(IsNullable = true)]
           public int CustomId { get; set; }
           [Navigate(NavigateType.OneToMany, nameof(OrderItem.OrderId))]//
           public List<OrderItem> Items { get; set; }
 }<br>
 var list = db.QueryableWithAttr<Order>()
                   .Includes(z => z.Items)//跨库一对多
                   .ToList();

3.3 跨库查询之多对多  

我们将3个表扔进3个不同的库里面

var db = new SqlSugarClient(new List<ConnectionConfig>()
   {
       new ConnectionConfig(){ConfigId="A",DbType=DbType.Sqlite,ConnectionString="DataSource=/A_DB.sqlite",IsAutoCloseConnection=true},
       new ConnectionConfig(){ConfigId="B",DbType=DbType.Sqlite,ConnectionString="DataSource=/B_DB.sqlite",IsAutoCloseConnection=true  },
       new ConnectionConfig(){ConfigId="AB",DbType=DbType.Sqlite,ConnectionString="DataSource=/AB_DB.sqlite",IsAutoCloseConnection=true  }
 });

 实体

 [Tenant("A")]//指定为A库
        public partial class OperatorInfo
        {
            /// <summary>
            /// 主键
            /// </summary>
            [SugarColumn(IsPrimaryKey = true)]
            public int id { get; set; }

            /// <summary>
            /// 姓名
            /// </summary>
            public string realname { get; set; }

            /// <summary>
            /// 多角色
            /// </summary>
            [Navigate(typeof(OptRole), nameof(OptRole.operId), nameof(OptRole.roleId))]//配置导航
            public List<Role> Roles { get; set; }
        }

        [Tenant("B")]//指定为B库
        public partial class Role
        {
            /// <summary>
            /// 角色
            /// </summary>
            [SugarColumn(IsPrimaryKey = true )]
            public int id { get; set; }

            /// <summary>
            /// 角色名称
            /// </summary>
            public string name { get; set; }

        }
        [Tenant("AB")]//指定为AB库
        public partial class OptRole
        {
            /// <summary>
            ///
            /// </summary>
            [SugarColumn(IsPrimaryKey = true)]
            public int id { get; set; }

            /// <summary>
            ///
            /// </summary>
            public int operId { get; set; }

            /// <summary>
            ///
            /// </summary>
            public int roleId { get; set; }

        }

//3个库3个表进行多对多查询
var x=db.QueryableWithAttr<OperatorInfo>()
.Includes(z => z.Roles).ToList();

3.4 多个表查询我们可以这么写

//多个表联表
var x=db.QueryableWithAttr<TB>()
.Includes(z => z.A1)
.Includes(z => z.A2)
.Includes(z => z.A3).ToList();

//多个表嵌套联表
var x=db.QueryableWithAttr<TB>()
.Includes(z =>z.A1, z.Province,z=>z.City)//4个层级
.Includes(z => z.A2)
.Includes(z => z.A3).ToList();

3.5 手动指定多库

上面都是通多特性实现的多库查询,我们也可以手动指定数据库进行多库查询

var list =db.GetConnection("db1").Queryable<OrderItem>()//Orderitem是db1
               .CrossQuery(typeof(Order), "db2")//Order是db2
               .Includes(z => z.Order)
               .ToList();

3.6是否有性能问题

不会SqlSugar跨库导航和不跨库导航是一套算法,性能有保障,也就是单库和多库性能是一样的

原理:一次获取需要的数据,在内存分配置,数据多可进行拆分读取

如今的成绩

企业认可以:

  51job 搜索 简历数 仅次 EF 和 Dapper 超过国外的  Nhibernate PetaPoco , 占Dapper 40%简历数

知名收费框架 JNPF 和 力软 都有使用 SqlSugar

培训机构开始 讲解SqlSugar

用户认可

拥有强大的生态,3k以上的项目就有4个,基本都在500星以上,不算生态就拥有5个2000人群

 RuYiAdmin 、ZrAdminNetCore 、Admin.NET通用管理平台(gitee 3k) Yi框架(Ruoyi Vue) CoreShop商城(gitee 3k) Blog.Core(github 4k)

YuebonCore Furion(gitee8k) WebFirst 腾讯 APIJSON.NET WaterCloud微服务

ViperFamilyBucket SmartSqlvboot-net WMS仓库管理系统magic.net

源码地址:

SqlSugar一直在努力创新,喜欢的Github关注一下,文章推荐或转发

https://github.com/donet5/SqlSugar

到此这篇关于.NET 6 跨服务器联表查询操作MySql、Oracle、SqlServer等相互联表的文章就介绍到这了,更多相关.NET 6 跨服务器联表查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SQLServer 跨库查询实现方法

    本文给出一条 SQL 语句用于展示在同一名服务器上,不同的数据库间查询,注意当前连接用户要对两个库都有权限SQL Server 中 SQL 语句中对象的完整表达式是: [DatabaseServer].[DatabaseName].[DatabaseSchema].[DatabaseObject] 本文给出一条 SQL 语句用于展示在同一名服务器上,不同的数据库间查询,注意当前连接用户要对两个库都有权限. 复制代码 代码如下: select * from CfteaDb1.dbo.CfteaTa

  • SQL Server跨服务器操作数据库的图文方法(LinkedServer)

    基础知识介绍 以SQL Server的数据库管理工具SSMS(SQL Server Management Studio)为平台进行操作. SQL Server Management Studio (SSMS) 是用于管理SQL Server 基础结构的集成环境. 使用 SSMS,可以访问.配置.管理和开发 SQL Server.Azure SQL 数据库和 SQL 数据仓库的所有组件. SSMS 在一个综合实用工具中汇集了大量图形工具和丰富的脚本编辑器,为各种技能水平的开发者和数据库管理员提供对

  • 深入SQL Server 跨数据库查询的详解

    语句SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field"DBO"可以省略 如SELECT * FROM 数据库A..表A a, 数据库B..表B b WHERE a.field=b.fieldSqlServer数据库:--这句是映射一个远程数据库EXEC sp_addlinkedserver '远程数据库的IP或主机名',N'SQL Server'--这句是登录远程数据库EXEC sp_addlinkedsr

  • SQL Server 跨库同步数据

    最近有个需求是要跨库进行数据同步,两个数据库分布在两台物理计算机上,自动定期同步可以通过SQL Server代理作业来实现,但是前提是需要编写一个存储过程来实现同步逻辑处理.这里的存储过程用的不是opendatasource,而是用的链接服务器来实现的.存储过程创建在IP1:192.168.0.3服务器上,需要将视图v_custom的客户信息同步到IP2:192.168.0.10服务器上的t_custom表中.逻辑是如果不存在则插入,存在则更新字段. create PROCEDURE [dbo]

  • MSSQLSERVER跨服务器连接(远程登录)的示例代码

    MSSQLSERVER跨服务器链接服务器创建方法如下 复制代码 代码如下: --声明变量  Declare @svrname varchar(255),  @dbname varchar(255), @sapassword varchar(255)   --请在执行前,根据实际情况修改下列变量 select @svrname  = '目标服务器名',       @dbname   = '目标数据库',   @sapassword  = 目标数据库密码    if exists ( select

  • SQL Server实现跨库跨服务器访问的方法

    前言 我们经常会遇到一个数据库要访问另一个数据库,或者一台服务器要访问另一台服务器里面的数据库. 那么这个如何实现的呢? 相信看完这篇文章你就懂了! 同一台服务器跨库访问实现 1. 首先创建两个数据库CrossLibraryTable1,CrossLibraryTable2 --创建CrossLibraryTable1脚本: use master --打开master数据库,一般的创建语句都在master中执行. go if exists (select * from sysdatabases

  • django框架基于queryset和双下划线的跨表查询操作详解

    本文实例讲述了django框架基于queryset和双下划线的跨表查询操作.分享给大家供大家参考,具体如下: 前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(...)  对象.关联对象_set.all(...)  -->反向 基于对象的跨表查询例如: book_obj= Book.objects.filter(id=4).first() #注意多了个first print(book_obj) #go 这里得到的是一个models对象 print(book_obj.publ

  • Yii框架连表查询操作示例

    本文实例讲述了Yii框架连表查询操作.分享给大家供大家参考,具体如下: Join //表连接 //查询出学生.班级.校区.记录表的所有数据 $data=Jf_record::find() ->join('join','jf_stu','jf_record.sid=jf_stu.sid') ->join('join','jf_class','jf_stu.cid=jf_class.cid') ->join('join','jf_school','jf_class.xid=jf_school

  • MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    本文实例讲述了MySQL单表查询操作.分享给大家供大家参考,具体如下: 语法 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名                   WHERE 条件                   GROUP BY field                   HAVING 筛选                   ORDER BY field                   LIMIT 限制条数 二.关键字的执行优先级(重点) 重点中的重点:关键

  • mysql从一张表查询批量数据并插入到另一表中的完整实例

    说在前面 nodejs 读取数据库是一个异步操作,所以在数据库还未读取到数据之前,就会继续往下执行代码. 最近写东西时,需要对数据库进行批量数据的查询后,insert到另一表中. 说到批量操作,让人最容易想到的是for循环. 错误的 for 循环版本 先放出代码,提前说明一下,在这里封装了sql操作:sql.sever(数据库连接池,sql语句拼接函数,回调函数) for(let i=0;i<views.xuehao.length;i++){ sql.sever(pool,sql.select(

  • mongodb实现同库联表查询方法示例

    前言 最近在工作中遇到一个问题,需要对mongodb数据库进行联表查询操作,发现网上这方面的资料较少,无奈只能自己来实现了,下面话不多说了,来一起看看详细的介绍: 注意:这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询) 我用到的联表查询有两种,一种是mongoose的populate,一种是$lookup 一.populate populate是使用外键关联子表 例如现在有一张订单表结构(动态外键): var orderSchema = new

  • MySQL联表查询的简单示例

    MySql会用到联表查询,对于刚学习的新手来说,可能会理解起来有难度.下面这篇文章就来给大家详细介绍MySQL联表查询的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 关系型数据库,免不了表之间存在各种引用与关联.这些关联是通过主键与外键搭配来形成的.所以,取数据时,很大情况下单张表无法满足需求,额外的数据则需要将其他表加入到查询中来,这便是 JOIN 关键字完成的操作. MySQL 中 JOIN, CROSS JOIN 和 INNER JOIN 三者语法功能上相同,可

  • MySQL约束和表的复杂查询操作大全

    目录 一. 数据库约束 1. 数据库常用约束 2. not null 约束 3. unique约束 4. default设置默认值 5. primary key约束 6. 分库分表下的自增主键 7. foreign key约束 8. 主键,外键,uniqe运用原理 二. 表的设计 1. 一对一关系 2. 一对多关系 三. 表的复杂查询操作 1. 将一个表中的数据插入到另一个表中 2. 聚合查询 2.1 聚合函数 2.2 分组查询 2.3 having 3. 多表查询(联合查询) 3.1 笛卡尔积

  • MySQL入门(三) 数据库表的查询操作【重要】

    序言 1.MySQL表操作(创建表,查询表结构,更改表字段等), 2.MySQL的数据类型(CHAR.VARCHAR.BLOB,等), 本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接).LEFT JOIN(左连接).RIGHT JOIN(右连接)等一些复杂查询. 通过本节的学习,可以让你知道这些基本的复杂查询是怎么实现的,但是建议还是需要多动手去敲,虽然理解了什么是内连接等,但是从理解到学会,是完全不一样的感觉. --WH 一.单表查询 1.1.查

  • thinkphp学习笔记之多表查询

    在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题 有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有以下几种方法: ㈠视图模型(推荐) 定义视图模型,只需要继承Think\Model\ViewModel,然后设置viewFields属性即可 public $viewFields = array( 'pl' =>array('uid','rid','content'), 'user' =>arra

  • Mybatis详解动态SQL以及单表多表查询的应用

    目录 单表查询操作 参数占位符#{}和${} SQL 注入 like模糊查询 多表查询操作 一对一多表查询 一对多多表查询 动态SQL使用 if标签 trim标签 where标签 set标签 foreach标签 单表查询操作 参数占位符#{}和${} #{}:相当于JDBC里面替换占位符的操作方式(#{}->“”).相当于预编译处理(预编译处理可以防止SQL注入问题) ${}:相当于直接替换(desc这种关键字),但这种不能预防SQL注入 select * from userinfo where

随机推荐