使用C# LINQ查询MySQL所有数据库名称的实现方案咨询
实现方案
MySQL的所有schema名称存储在系统库information_schema的SCHEMATA表中,原生LINQ无法直接查询未映射到DbContext的系统表,直接用SqlQuery执行原生SQL是最简便的实现方式,适配不同EF Core版本的代码如下:
EF Core 7.0及以上版本
EF Core 7开始支持直接返回基础类型的原生查询,无需额外定义实体:
var databaseNames = serverDataContext.Database .SqlQuery<string>($"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA") .ToArray();
EF Core 7.0以下版本
需要先做简单的配置后再查询:
- 定义查询结果接收类
public class SchemaInfo { public string SchemaName { get; set; } }
- 在
DataContext的OnModelCreating方法中配置无键实体
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<SchemaInfo>().HasNoKey(); // 原有其他实体配置保留即可 }
- 执行查询获取结果
var databaseNames = serverDataContext.Set<SchemaInfo>() .FromSqlRaw("SELECT SCHEMA_NAME AS SchemaName FROM information_schema.SCHEMATA") .Select(s => s.SchemaName) .ToArray();
补充说明:如果硬要使用LINQ实现,需要手动将
information_schema.SCHEMATA表完整映射到DbContext的实体中,额外工作量大,没有实际必要。
内容的提问来源于stack exchange,提问作者GolfBravo
相关产品推荐
相关产品推荐

