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

问题描述 投票:0回答:1

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

linq user-defined-functions ef-core-2.0 scalar
1个回答
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);
© www.soinside.com 2019 - 2024. All rights reserved.