【问题标题】:Map scalar-valued SQL function to method将标量值 SQL 函数映射到方法
【发布时间】: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


【解决方案1】:

如果错误不清楚,请尝试用参数指定[DbFunction]标签:

[DbFunction(FunctionName = "TEST_FUNCTION", Schema = "test")]

使用您的数据库架构和函数名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2023-01-15
    • 2011-07-23
    • 2014-01-04
    • 2017-10-13
    • 2019-07-21
    相关资源
    最近更新 更多