我对学习 APS.NET Core Web API 非常陌生,并且我无法从使用 FromSqlRaw 运行的存储过程中获得结果
我有一个输入类:
public class DevInput
{
public string DevID { get; set;}
public int Source { get; set;}
}
我有一个输出类:
public class DevOutput
{
public string Name{ get; set;}
public string Cost { get; set; }
public string OrdQty { get; set;}
public string Model { get; set}
}
我正在将 SQL 存储过程的返回值映射到所述类:
public class DevOutputController : ControlleBase
{
private readonly DevContext _context;
public DevOutputContoller(DevContext context)
{
_context = context
}
[HttpPost]
public async Task<ActionResult<IEnumerable<DevOutput>>> GetOutput(DevInput input)
{
string sp = "Exec DevSearch '" + input.DevID + "', " + input.Source + ""
return await _context.DevOutput.FromSqlRaw(sp).ToListAsync
}
}
这工作正常,除了有时从存储过程返回的“成本”是十进制类型,有时是字符串类型,具体取决于从哪个 SQL 表检索“成本”值
我想知道是否有一种方法可以将从存储过程返回的任何内容转换为字符串,以便它可以正确映射到我的输出类
我强烈建议您修复存储过程以返回一致的列类型 - 否则您将不得不在某些时候分叉您的逻辑以考虑数字或字符串值。现在,系统尝试直接转换为字符串,如果源数据不是字符串类型,则会失败,因为转换不会隐式调用
ToString
将值转换为字符串。
但是,可以尝试的一种解决方法是使用
object
作为字段类型,然后在原始数据层之外将值 convert 为十进制。您可以通过使用 Convert.ChangeType(val, typeof(decimal))
动态地执行此操作,它将按原样获取十进制值或在运行时解析字符串值。使用 object
确实可以发挥装箱(存储原始值作为参考)的作用,但您必须确定可能的性能影响是否足以更改原始数据层,以便您可以在本机使用 decimal
。