【发布时间】:2019-12-31 10:43:57
【问题描述】:
在 DbContext 类中,我尝试将方法映射到 SQL 标量函数。
我能找到的唯一文档在这里:https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#database-scalar-function-mapping
我在哪里可以找到关于此的完整文档?
我尝试过这样的事情,但我总是得到我在该函数中抛出的异常。我可以获得更多关于问题所在的详细信息吗?
[DbFunction]
public static double CalcAmount(int Company, string Item, double Quantity)
=> throw new Exception();
名称与 SQL 函数相同。我还尝试在属性中添加架构和函数名称,并使用模型构建器添加函数,但没有任何效果。
SQL 权限也不是问题。
只有名字重要吗? double vs float 有问题吗? (我都试过了)
我可以在任何地方使用该功能吗?我尝试在 LINQ 查询中使用它。
更新:
我是这样使用函数的:
from t in ctx.MyTable
select new { t, amount=MyDbContext.CalcAmount(1, "123", 2)}
如果我这样使用它:
from t in ctx.MyTable
select new { t.Prop1, t.Prop2, amount=MyDbContext.CalcAmount(1, "123", 2)}
然后就可以了。 见伊万·斯托耶夫的 cmets
【问题讨论】:
-
不幸的是,您包含的链接是此功能的唯一文档。你的
CalcAmount方法在哪里?请注意,如果它不在派生的DbContext类中,则需要明确配置才能包含在模型中。另请注意,此类函数只能在 LINQ to Entities 查询中使用。 -
它在 DbContext 派生类中:from t in ctx.MyTable select new { t, amount=MyDbContext.CalcAmount(1, "123", 2)}
-
我明白了。最有可能的问题是示例查询导致客户端评估,并且该函数应该被转换为 SQL。如果您更改这样的选择子句
new { t.SomeProp1, t.SomeProp2, amount = …},它应该可以工作。即选择整个实体t加上一些东西会导致对客户端进行评估。 EF Core 缺陷。 -
是的!现在可以了!!
-
感谢您的帮助!如果您添加答案,我会接受。
标签: c# entity-framework .net-core entity-framework-core ef-core-2.2