EF Core 2-如何调用标量函数?

时间:2019-02-05 23:10:02

标签: linq user-defined-functions ef-core-2.0 scalar

我正在使用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!

1 个答案:

答案 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);