我正在使用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);
但这只会引发异常。
有什么建议吗?
TIA!
答案 0 :(得分:0)
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);