ASP.NET Core 3.1控制器如何调用SQL Server标量函数并赋值给模型属性
ASP.NET Core 3.1 调用SQL Server标量函数实现方案
前置修正:Employee 模型类语法修复
你提供的模型类存在语法错误,修正后代码如下:
// Employee.cs public class Employee { public int Id { get; set; } public string EmpName { get; set; } public decimal EmpHrs { get; set; } }
方案1:无需修改DbContext,直接执行SQL获取标量值(推荐快速实现)
直接在控制器方法中通过数据库连接对象执行标量查询即可,代码示例:
// 控制器方法内逻辑 var emp = new Employee(); // 若需给现有库中实例赋值,替换为查询逻辑即可: // var emp = dbContext.Employees.FirstOrDefault(x => x.Id == 目标ID); using var command = dbContext.Database.GetDbConnection().CreateCommand(); command.CommandText = "SELECT dbo.EmpHrs()"; command.CommandType = System.Data.CommandType.Text; if (dbContext.Database.GetDbConnection().State != System.Data.ConnectionState.Open) { dbContext.Database.OpenConnection(); } var scalarResult = command.ExecuteScalar(); emp.EmpHrs = Convert.ToDecimal(scalarResult);
方案2:配置DbContext映射标量函数,支持LINQ调用
如果你需要在多个地方调用该标量函数,可通过DbFunction特性完成映射,实现更规范的调用:
- 在你自定义的DbContext类中添加函数映射定义
// 你的DbContext类中添加以下代码 public class YourDbContext : DbContext { public DbSet<Employee> Employees { get; set; } // 映射SQL Server的dbo.EmpHrs标量函数 [DbFunction("EmpHrs", "dbo")] public static decimal EmpHrs() { throw new NotSupportedException("该方法仅用于EF Core映射数据库标量函数,不可直接调用"); } // 原有OnModelCreating等其他代码保持不变 }
- 控制器中调用逻辑
// 控制器中直接调用映射后的函数即可 var emp = new Employee(); emp.EmpHrs = YourDbContext.EmpHrs(); // 也可直接在LINQ查询中使用,例如: var empList = dbContext.Employees.Select(e => new Employee { Id = e.Id, EmpName = e.EmpName, EmpHrs = YourDbContext.EmpHrs() }).ToList();
内容的提问来源于stack exchange,提问作者Alan Pauil
相关产品推荐
相关产品推荐

