You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表查询不同标量值,可以用无键实体简化原有实体方案,不需要手动配置主键和表映射:

  1. 定义带无键标记的Dual实体
[Keyless]
public class Dual
{
    public DateTime SysDate { get; set; }
}
  1. 在DbContext中注册DbSet
public DbSet<Dual> Dual { get; set; }
  1. 执行查询
public async Task<DateTime> GetTime()
{
    return await _dbContext.Dual.FromSqlRaw("SELECT SYSDATE FROM DUAL")
        .Select(d => d.SysDate)
        .FirstAsync();
}

内容的提问来源于stack exchange,提问作者Sara Mannings

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:45:04