Entity Framework Core: 用户定义的 SQL 函数

7

在EF Core的查询接口中是否可以调用用户定义的SQL函数?例如,生成的SQL代码应该如下:

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

在我的情况下,这个子句是除了其他Query()方法调用之外的一个选择,因此FromSQL()不是一个选项。


4
请查看数据库标量函数映射 - Ivan Stoev
1个回答

8

这篇文章的帮助下(感谢@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));

1
如果您通过Fluent API手动注册静态函数,则它不需要在派生的DbContext类中。从EF Core 2.1开始,它也可以是成员函数,但此时必须在派生的DbContext类上声明。 - Paul
@Shaul Behr。EF Core 2.1是否支持映射Sql表值函数? - Raida Adn
@RaidaAdn 我不知道,没有尝试过。你试过了吗? - Shaul Behr
是的,我昨天尝试过了。但是在搜索了足够多的资料之后,我得出结论,目前调用Sql表值函数的可能解决方案是使用EFCore中的FromSql()。 - Raida Adn
通过将函数放在 DbContext 中,我不需要将其设为静态。这意味着我可以这样做:var query = db.Foos.Where(f => db.SatisfiesMyUserFunction(f.FieldValue)); - Pluto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接