linq - EF Core 2 - 如何调用标量函数?
问题描述
我正在使用 EF Core 2。
我的 SQL 中有一个用户定义的函数。
CREATE FUNCTION udfCPIAdjustedAmount
(
@WorkOrderID int,
@VendorContractPayItemID int,
@Qty decimal,
@QtyIdle decimal,
@QtyOT decimal
)
RETURNS decimal(18,2)
AS
BEGIN
-- code replaced with something simple
return @Qty * 2
END
它在我的 DbContext 类中声明如下:
[DbFunction("udfCPIAdjustedAmount", "dbo")]
public static decimal CPIAdjustedAmount(int WorkOrderID, int VendorContractPayItemid, decimal Qty, decimal QtyIdle, decimal QtyOT) { throw new Exception(); }
我可以像这样从我的控制器成功调用它:
decimal AdjustedAmount = (from wo in _context.WorkOrder
where wo.WorkOrderID == WorkOrderID
select PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT)).First();
但是,我觉得必须有一个更简单的方法。我认为没有理由必须在 LINQ 查询中引用任何特定表(例如,我给出的示例中的 WorkOrder 表)。它返回一个十进制值,并且 UDF 的参数不引用任何查询数据。
我觉得我应该能够做这样的事情:
decimal AdjustedAmount = PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT);
但这只会引发异常。
有什么建议么?
蒂亚!
解决方案
DbFunction允许将数据库标量函数映射到类中的方法。
此方法只能在 LINQ 查询中使用,并被转换为 SQL 语句。以下语句中的 PMSContext 会将其转换为 SQL 语句,因此这将按预期工作。
decimal AdjustedAmount = (from wo in _context.WorkOrder
where wo.WorkOrderID == WorkOrderID
select PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT)).First();
在下面的语句中,该方法在没有 DbContext 对象的情况下使用,并且不在 LINQ 查询中,因此它将作为 C# 语句而不是 SQL 查询执行,因此它将抛出从方法抛出的异常。
decimal AdjustedAmount = PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT);
推荐阅读
- python - 如何构建个性化排列
- revit-api - Revit API。ReferenceIntersector 与 TopografySurfaces
- bluetooth - 蓝牙 LE 扫描过滤器 MAC 地址通常不适用于所有列表
- webpack - webpack 的 eslint 和 babel 设置与 .eslintrc 和 .babelrc 的关系
- awk - awk 命令的别名
- package - 如何在 Anaconda 上安装 hickle?
- c# - 无法将“边界”添加到 multipart/form-data
- javascript - 我面临与 ngx-spinner 相关的问题
- sql - 尝试更新表时,postgresql 中列的最小-最大规范化不起作用
- javascript - 如何在打字稿的对象中使用类变量?