首页 > 解决方案 > 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);

但这只会引发异常。

有什么建议么?

蒂亚!

标签: linquser-defined-functionsef-core-2.0scalar

解决方案


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

推荐阅读