【问题标题】:Entity Framework Core: User Defined SQL FunctionsEntity Framework Core:用户定义的 SQL 函数
【发布时间】:2020-05-16 12:50:03
【问题描述】:

是否可以从 EF Core 的查询接口调用用户定义的 SQL 函数?例如,生成的 SQL 看起来像

select * from X where dbo.fnCheckThis(X.a, X.B) = 1

就我而言,此子句是对其他 Query() 方法调用的补充,因此 FromSQL() 不是一个选项。

【问题讨论】:

标签: entity-framework entity-framework-core


【解决方案1】:

我刚刚在 this article 的帮助下解决了这个问题(H/T @IvanStoev 他对这个问题的评论)。

在您的DbContext 班级中:

[DbFunction("my_user_function_name")]
public static bool SatisfiesMyUserFunction(int i)
{
    throw new Exception(); // this code doesn't get executed; the call is passed through to the database function
}

注意函数必须DbContext类中,即使它是静态的。

然后创建一个数据库迁移并在脚本中定义用户函数。

用法:

var query = db.Foos.Where(f => MyDbContext.SatisfiesMyUserFunction(f.FieldValue));

【讨论】:

  • 静态函数不需要在派生的DbContext类中,使用fluent api手动注册即可。从 EF Core 2.1 开始,它也可以是成员函数,但需要在派生的 DbContext 类上声明。
  • @Shaul Behr。 EF Core 2.1 是否支持映射 Sql 表值函数?
  • @RaidaAdn 我不知道;没试过。你试过了吗?
  • 是的,我昨天试过了。但是在谷歌搜索足够多之后,我得出结论,当前调用 Sql 表值函数的可能解决方案是在 EFCore 中使用 FromSql()。
  • 通过将函数放入DbContext,我不需要将其设为静态。这意味着我可以这样做:var query = db.Foos.Where(f => db.SatisfiesMyUserFunction(f.FieldValue));
猜你喜欢
  • 2021-04-17
  • 2011-03-30
  • 2019-07-23
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多