using APT.BaseData.Domain.ApiModel; using APT.BaseData.Domain.ApiModel.PF; using APT.BaseData.Domain.Entities.FM; using APT.BaseData.Domain.IServices.OP; using APT.MS.Domain.Entities.SK; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace APT.SK.WebApi.Controllers.Api { public class CrossDbContext : DbContext { public DbSet T_SK_BASIC_LIBRARY { get; set; } // 动态连接字符串(外部传入) private readonly string _connString; // 构造函数:动态接收连接字符串 public CrossDbContext(string connString) { _connString = connString; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 使用动态的连接字符串 optionsBuilder.UseSqlServer(_connString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 必须把你的实体配置进去,EF才认识它 modelBuilder.Entity() .Ignore(x => x.Nav_Org) .Ignore(x => x.DbConn) .Ignore(x => x.TaskID); //modelBuilder.Entity() // .Ignore(x => x.departmentCheckedKeys); } /// /// 跨库查询:同服务器,多个库 /// /// 库名列表 /// 跨库合并结果 public IQueryable QueryCrossDatabases(List databaseNames) { IQueryable? query = null; foreach (var dbName in databaseNames) { // 核心:动态拼接 库名.dbo.表名 string sql = $"SELECT * FROM {dbName}.dbo.T_SK_BASIC_LIBRARY"; var dbSet = this.Set().FromSqlRaw(sql); query = dbSet; //query = query == null ? dbSet : query.UnionAll(dbSet); } return query ?? Enumerable.Empty().AsQueryable(); } /// /// 跨库查询:同服务器,多个库,静态数据库连接时直接给库名称 /// /// 跨库合并结果 // ========== 查询方法:直接跨库合并 ========== public IQueryable GetAllUserInfos() { // 查询库B(关键:直接修改表名,同服务器跨库) var dbBUsers = this.Set() .FromSqlRaw("SELECT * FROM mh_jy_head.dbo.T_SK_BASIC_LIBRARY"); return dbBUsers; } } }