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

Linq EF核心2-如何调用标量函数?,linq,user-defined-functions,ef-core-2.0,scalar,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 somet

我正在使用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();
decimal AdjustedAmount = PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT);
我可以通过我的控制器成功调用它,如下所示:

[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();
decimal AdjustedAmount = PMSContext.CPIAdjustedAmount(WorkOrderID, VendorContractPayItemID, Qty, QtyIdle, QtyOT);
然而,我觉得必须有一个更简单的方法。我看不出有任何理由必须引用LINQ查询中的任何特定表(例如,我给出的示例中的WorkOrder表)。它返回一个十进制值,UDF的参数不引用任何查询数据

我觉得我应该可以做这样的事情:

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

我认为最简单的方法是定义使用此函数的视图,然后您可以查询该视图。在我看来,在DbContext中,CPIAjustAmount似乎是一个标准的静态函数。出于好奇:这个函数抛出一个异常。这是你得到的例外吗?如果程序只返回7,你是否也会得到一个异常,您尝试了:
decimal adjustedAmount=PMSContext.cpiastedamount(…)
@Harald copoolse,我发布的代码与您发布的代码匹配,返回从我发布的公共静态函数引发的异常。我很有信心,如果我将该函数更改为“return 7;”,它将返回该函数。但是,这是没有帮助的。我可以将该函数改为执行LINQ查询,但这并不能解决问题。它只是把我不喜欢的代码从一个地方移到另一个地方。@VolodymyrBilyachat我不懂你的意思。我可以创建一个视图,但是我的LINQ查询看起来完全一样,只引用一个视图,而不是一个表,对吗?对我来说,这没有什么不同。