设计一个企业网站首页,seo综合查询站长工具关键词,网站优化的主要任务,外贸网站示例文章目录 一、跨库方式1#xff1a;跨库导航二、手动跨库查询三、同服务器#xff1a;自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器#xff1a;自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配… 文章目录 一、跨库方式1跨库导航二、手动跨库查询三、同服务器自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配置 PgSql Pwd外部表4.4 其他跨服务器联表 五、跨库子查询5.1 用ThenMapper实现5.2 Subqueryable5.3 嵌套查询或者Unionall 六、.NET开源 ORM 框架 SqlSugar 系列 一、跨库方式1跨库导航
最低版本支持5.1.3.24
✅优点1支持跨服务器支持跨数据库品种, 支持任何类型数据库✅优点2: 超级强大的性能能达到本库联表性能缺点不支持 子表过滤主表 (方案有 ToList 后在内存过滤 如果分页可以查 前1000条 主表在内存分页 前端只显示 前10页 )
[Tenant(db2)] //实体标为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; }}
[Tenant(db1)] //实体标为db1
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 ListOrderItem Items { get; set; }}//通过ConfigId进行区分是哪个库
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIddb1,DbTypeDbType.Sqlite,ConnectionStringDataSource/Db_OrderDb.sqlite,IsAutoCloseConnectiontrue},new ConnectionConfig(){ConfigIddb2,DbTypeDbType.Sqlite,ConnectionStringDataSource/Db_OrderItemDb.sqlite,IsAutoCloseConnectiontrue }
});//注意如果是接口需要
//db.AsTenant().QueryableWithAttrOrderItem()//通过实体类特性Tenant自动映射不同数据库进行查询
var listdb.QueryableWithAttrOrderItem()
.Includes(z z.Order)
.ToList(); //1行代码就搞定了2个库联表查询//不通过特性实现跨库导航
var list db.GetConnection(db1).QueryableOrderItem()//Orderitem是db1.CrossQuery(typeof(Order), db2)//Order是db2.Includes(z z.Order).ToList();如果想详细了解请移步 详细教程 (5.1.3.25)
二、手动跨库查询 ✅优点联表语法100%可以用 缺点只支持个别数据库并且跨服务器比较麻烦需要配置dblink
大多数的数据库支持下面的写法我们可以通过 As 指定是哪个库, 查询的时候用别名
注意不同数据库写法有区别 下面是 SqlServer 例子 库名 .dbo.表名
//单表跨库
var listdb.QueryableOrder().AS(xx.dbo.Order2019).ToList();//SqlServer (跨库用dblink)
var list1 db.QueryableOrder() //主表用当前db就行了.LeftJoinOrderItem((o,i) o.Id i.OrderId,yy.dbo.OrderItem) .LeftJoinCustom((o, i, c) c.Id o.CustomId,zz.dbo.Custom) .Where((o,i,c) o.TypeId1).Select((o,i,c)new classA() { oido.Id , inamei.Name }).ToList();//MySql (只能同服务器)
var list1 db.QueryableOrder(). //如果跨服务器需要配置dblink语法上每种数据库有点小差异.LeftJoinOrderItem((o,i) o.Id i.OrderId,yy.OrderItem) .LeftJoinCustom((o, i, c) c.Id o.CustomId,zz.Custom) .Where((o,i,c) o.TypeId1).Select((o,i,c)new classA() { oido.Id , inamei.Name }).ToList(); //Oracle
var list1 db.QueryableOrder() .LeftJoinOrderItem((o,i) o.Id i.OrderId,\ORDERITEM\dblink_name) .LeftJoinCustom((o, i, c) c.Id o.CustomId,\CUSTEM\dblink_name) .Where((o,i,c) o.TypeId1).Select((o,i,c)new classA() { oido.Id , inamei.Name }).ToList(); //其他库同理//老版本多表跨库
var list1 db.QueryableOrder().AS(xx.dbo.order) // AS().LeftJoinOrderItem((o,i) o.Id i.OrderId).ASOrderItem(yy.dbo.OrderItem) //AST.LeftJoinCustom((o, i, c) c.Id o.CustomId) .ASCustom(zz.dbo.Custom)//AST.Select((o,i,c)new classA() { oido.Id , inamei.Name }).ToList();//获取表名可以减少字符串操作var tableNamedb.EntityMaintenance.GetTableNameT() //如果有2个AST是相同我们可以这么写.LeftJoin(db.QueryableT().AS(xx.dbo.zzzz),(o,i)o.idi.id)请升级到5.1.4.86-preview01
三、同服务器自动查询跨库查询
3.1 Mysql和SqlServer自动
注意
只支持 MySql 和 SqlServer 同服务器并且是同一种类型的库你有办法支持其他库可以反馈给我查询用的是 QueryableWithAttr 不是 Queryable
//声名SqlSugar对象
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIdA,DbTypeDbType.SqlServer,ConnectionString..,IsAutoCloseConnectiontrue},new ConnectionConfig(){ConfigIdB,DbTypeDbType.MySql,ConnectionString..,IsAutoCloseConnectiontrue },new ConnectionConfig(){ConfigIdC,DbTypeDbType.MySql,ConnectionString..,IsAutoCloseConnectiontrue }
});//实体配置是哪个库
[Tenant(A)] //实体标为A表示是A库
public class OrderItem
[Tenant(B)] //实体标为B表示是B库
public class Order//联表查询要5.1.4.66才支持
var list db.QueryableWithAttrOrder() //根根据ConfigId自动实现跨库.LeftJoinOrderItem((o,i) o.Id i.OrderId) .LeftJoinCustom((o, i, c) c.Id o.CustomId) .Where((o,i,c) o.TypeId1).Select((o,i,c)new classA() { oido.Id , inamei.Name }).ToList();//ISqlSugarClient需要转一下租户接口才能用租户方法
var list db.AsTenant().QueryableWithAttrOrder()....3.2 自动: PgSql跨Scheme查询
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIdA,DbTypeDbType.PostgreSQL,ConnectionString..,IsAutoCloseConnectiontrue},new ConnectionConfig(){ConfigIdB,DbTypeDbType.PostgreSQL,DbLinkNamepublic,//重点ConnectionString.....;searchpathpublic//重点 ,IsAutoCloseConnectiontrue },
});
var x3 db.QueryableWithAttrOptRole().LeftJoinRole((x1, y1) x1.roleId y1.id)//Left Join时会加上public..ToList();//ISqlSugarClient需要转一下租户接口才能用租户方法
var list db.AsTenant().QueryableWithAttrOrder()....3.3 其他库同服务器
️找库规则3种
SqlServer: 库名.dbo.表名PgSql或者同类库:有配置 DbLinkName 和 searchpath : DbLinkName.表名其他库: 库名.表名
用法就上面3种用法如果发现哪个数据库不支持可以和我反馈。
四、跨服务器自动跨库查询
除了 sqlite其他的应该都支持 dblink 配置只要能配置 dblink 就能跨库查询也支持同服务器跨库。
4.1 配置SqlServer dblink
请升级5.1.4.72-preview02
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIdA,DbTypeDbType.SqlServer,ConnectionString..,IsAutoCloseConnectiontrue },new ConnectionConfig(){ConfigIdB,DbTypeDbType.SqlServer,//有些用户可以用IP跨库//DbLinkName[192.168.1.110].db240425.dbo.DbLinkNamedb1.ecology2013_SHQC2.dbo,//IP不能连在配置DbLinkConnectionString..,IsAutoCloseConnectiontrue }
});
//实体配置是哪个库
[Tenant(B)] //实体标为A表示是A库
public class OrderItem//联表查询要5.1.4.66才支持
var list1 db.QueryableWithAttrOrder() //根根据ConfigId自动实现跨库.LeftJoinOrderItem((o,i) o.Id i.OrderId) .ToList();
//生成Sql
//Left join db1.ecology2013_SHQC2.dbo.OrderItem下面是 SqlServer 的例子
✅ 可以企业管理器里添加 linkserver 实现。✅ 使用 sp_addlinkedserver 创建一个链接的服务器使其允许对分布式的、针对 OLEDB 数据源的异类查询进行访问。✅ 在使用 sp_addlinkedserver 创建链接的服务器之后此服务器就可以执行分布式查询。 步骤
创建 linkserver EXEC sp_addlinkedserverserverDB1,--被访问的服务器别名srvproduct, --sqlserver不需要指定providerSQLOLEDB,5datasrc192.168.1.102 --要访问的服务器登录链接服务器
EXEC sp_addlinkedsrvlogin DB1, --被访问的服务器别名false, --useselfNULL, --localloginsa, --帐号 123456 --密码4.2 配置 Oracle dblink
请升级到5.1.4.86-preview02
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIdA,DbTypeDbType.SqlServer,ConnectionString..,IsAutoCloseConnectiontrue },new ConnectionConfig(){ConfigIdB,DbTypeDbType.SqlServer,DbLinkNamedblink_name,//配置dblink名字要开头ConnectionString..,IsAutoCloseConnectiontrue }
});
//实体配置是哪个库
[Tenant(B)] //实体标为A表示是A库
public class OrderItem//联表查询要5.1.4.66才支持
var list1 db.QueryableWithAttrOrder() //根根据ConfigId自动实现跨库.LeftJoinOrderItem((o,i) o.Id i.OrderId) .ToList();
//生成Sql
//Left join OrderItemdblink_name下面是 Oracle 的例子
CREATE DATABASE LINK dblink_name
CONNECT TO target_usernameIDENTIFIED BY target_passwordUSING(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOSTtarget_host)(PORTtarget_port))(CONNECT_DATA(SERVICE_NAMEtarget_service_name)));4.3 配置 PgSql Pwd外部表
请升级到 5.1.4.86-preview02
var db new SqlSugarClient(new ListConnectionConfig()
{new ConnectionConfig(){ConfigIdA,DbTypeDbType.SqlServer,ConnectionString..,IsAutoCloseConnectiontrue },new ConnectionConfig(){ConfigIdB,DbTypeDbType.SqlServer,DbLinkNameremote_,//命名要以_结尾ConnectionString..,IsAutoCloseConnectiontrue }
});
//实体配置是哪个库
[Tenant(B)] //实体标为A表示是A库
public class OrderItem//联表查询要5.1.4.66才支持
var list1 db.QueryableWithAttrOrder() //根根据ConfigId自动实现跨库.LeftJoinOrderItem((o,i) o.Id i.OrderId) .ToList();
//生成Sql
//Left join remote_OrderItem下面是 PgSql 的例子
首先在源数据库中创建 postgres_fdw 扩展
CREATE EXTENSION postgres_fdw;在源数据库中创建外部服务器对象指定目标数据库的连接信息
CREATE SERVER target_serverFOREIGN DATA WRAPPER postgres_fdwOPTIONS (dbname targetdb, host targethost, port targetport);在上面的示例中target_server 是外部服务器的名称你需要提供目标数据库的连接信息如目标数据库的名称、主机和端口。
创建用户映射将源数据库的用户映射到目标服务器的用户 CREATE USER MAPPING FOR current_userSERVER target_serverOPTIONS (user targetuser, password targetpassword);确保提供正确的目标服务器的用户名和密码。
创建外部表在源数据库中创建一个外部表该表将映射到目标数据库中的表
CREATE FOREIGN TABLE IF NOT EXISTS remote_OrderItem (column1 INT,column2 TEXT,...
) SERVER target_server;字段结构要一样才能同步
现在你可以在源数据库中查询外部表就像查询本地表一样 SELECT * FROM remote_table;请升级到5.1.4.86-preview02
4.4 其他跨服务器联表
只要配置好 dblinkName 找表规则 默认: dblinkName.[表名] dblinkName 以 _ 结尾: dblinkName表名 (这个表名是没有转释符号的像 、[]、 “” 我们称为转释符号) dblinkName 以 开头 [表名]dblinkName
var list1 db.QueryableWithAttrOrder() //根根据ConfigId自动实现跨库.LeftJoinOrderItem((o,i) o.Id i.OrderId) .ToList();
//生成Sql
//Left join 规则生成的表名请升级到5.1.4.86-preview02
五、跨库子查询
5.1 用ThenMapper实现
支持跨库的类型只能用在 Select 对象填充
//跨库
var mydbdb.GetConnection(1);
mydb.ThenMapper(root,item{...});5.2 Subqueryable
请升级:5.1.4.107-preview11 db.QueryableOrder().Select(it new { x SqlFunc.SubqueryableOrderItem().AsWithAttr().Select(s s.OrderId)//生成表名规则看4.4和3.3}).ToList();//也可以用AS(表名)SqlFunc.SubqueryableOrder().AS(yyy.Order01).InnerJoinOrderItem((x,y)x.Idy.OrderId, yyy.OrderItem01).Select(xx.Id)5.3 嵌套查询或者Unionall //强制名库表名一般在嵌套或者unionall不能切换库中用
var qdb.QueryableOrder().AsWithAttr().Where(itit.Id10);
var q2db.QueryableOrder().AsWithAttr().Where(itit.Id2);
db.UnionAll(q,q2).ToList();
//下面用于嵌套查询或者union all六、.NET开源 ORM 框架 SqlSugar 系列
【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务】.NET开源 ORM 框架 SqlSugar 系列【连接池】.NET开源 ORM 框架 SqlSugar 系列【查询目录】.NET开源 ORM 框架 SqlSugar 系列【查询基础】.NET开源 ORM 框架 SqlSugar 系列【排序用法】.NET开源 ORM 框架 SqlSugar 系列【分组去重】.NET开源 ORM 框架 SqlSugar 系列【联表查询】.NET开源 ORM 框架 SqlSugar 系列【导航查询】.NET开源 ORM 框架 SqlSugar 系列【子查询】.NET开源 ORM 框架 SqlSugar 系列【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列【配置查询】.NET开源 ORM 框架 SqlSugar 系列【并集查询】.NET开源 ORM 框架 SqlSugar 系列【树型查询】.NET开源 ORM 框架 SqlSugar 系列【表格查询】.NET开源 ORM 框架 SqlSugar 系列【动态表达式】.NET开源 ORM 框架 SqlSugar 系列【查询函数】.NET开源ORM框架 SqlSugar 系列【过滤器】.NET开源 ORM 框架 SqlSugar 系列【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列【分页查询】.NET开源 ORM 框架 SqlSugar 系列