EF Core 5对接Oracle时从DUAL表获取SYSDATE的最优方案是什么
EF Core 5 从Oracle DUAL表获取SYSDATE最优实现方案
ExecuteSqlRawAsync仅返回SQL执行影响的行数,无法返回查询结果,不适用于单值查询场景。你不需要额外定义Dual实体和配置映射,可直接使用更简单的实现方案:
方案1:直接执行标量查询(最简方案,无额外代码依赖)
无需新增任何实体、DbSet、映射配置,直接复用EF Core的数据库连接执行ADO.NET标量查询即可,性能最优代码量最少:
public async Task<DateTime> GetTime() { var connection = _dbContext.Database.GetDbConnection(); var originalState = connection.State; try { // 仅在连接未打开时手动打开,不影响EF Core原生连接复用逻辑 if (originalState != System.Data.ConnectionState.Open) await connection.OpenAsync(); using var command = connection.CreateCommand(); command.CommandText = "SELECT SYSDATE FROM DUAL"; var result = await command.ExecuteScalarAsync(); return Convert.ToDateTime(result); } finally { if (originalState != System.Data.ConnectionState.Open) connection.Close(); } }
方案2:无键实体优化(适合频繁从DUAL查询多类标量的场景)
如果项目中需要频繁从DUAL表查询不同标量值,可以用无键实体简化原有实体方案,不需要手动配置主键和表映射:
- 定义带无键标记的Dual实体
[Keyless] public class Dual { public DateTime SysDate { get; set; } }
- 在DbContext中注册DbSet
public DbSet<Dual> Dual { get; set; }
- 执行查询
public async Task<DateTime> GetTime() { return await _dbContext.Dual.FromSqlRaw("SELECT SYSDATE FROM DUAL") .Select(d => d.SysDate) .FirstAsync(); }
内容的提问来源于stack exchange,提问作者Sara Mannings
相关产品推荐
相关产品推荐

