c# - 如何从 EF LINQ 查询调用数据库函数?

标签 c# sql-server entity-framework

在我的数据库中我定义了一些函数,假设它叫做fnTest。 是否可以从我的 LINQ/EF 查询中调用该函数?像这样:

var param3, param4;
var res = (from x in db.Something
           where x.field1 > 0
           orderby fnTest(x.f1, x.f2, param3, param4)
           select x).Take(20);

如您所见,我需要该函数在数据库端执行,因为我需要使用它返回的值对数据进行排序。前两个参数是表中的字段,后两个参数是一些在程序中会改变的数字,但对于每次查询都是不变的。

是否有可能以某种方式调用已在数据库中创建的函数?还是我需要使用这样的东西:

((IObjectContextAdapter) context).ObjectContext.CreateQuery

然后手动编写查询?

最佳答案

首先,fnTest 必须首先在数据库中创建为用户定义的函数:

CREATE FUNCTION [fnTest] (@fi int, @f2 int, @param3 int, @param4 int)
RETURNS int
AS ...

然后在您的 .edmx 文件中,像这样声明函数:

<Function Name="fnTest" ReturnType="int" Schema="dbo" >
    <Parameter Name="f1" Mode="In" Type="int" />
    <Parameter Name="f2" Mode="In" Type="int" />
    <Parameter Name="param3" Mode="In" Type="int" />
    <Parameter Name="param4" Mode="In" Type="int" />
</Function>

现在您可以像这样将此函数绑定(bind)到模型中的方法:

[EdmFunction("MyNamespace", "fnTest")]
public static int fnTest(int f1, int f2, int param3, int param4)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

您现在可以在标准 LINQ 查询中使用此方法。

延伸阅读

关于c# - 如何从 EF LINQ 查询调用数据库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16002106/

相关文章:

sql-server - 使用 ROW_NUMBER 应用分组排名

entity-framework - 如何在创建数据库时首先在 Entity Framework 代码中填充数据?

c# - Linq 查询和 Foreach 对来自 SQL 数据库的大量记录

c# - BackgroundDownloader 不适用于 Windows 10 移动版 UWP?

c# - 检查 IIS 应用程序池的状态

c# - 如何通过上下文菜单中的复制命令复制选定的 ListView 项

c# - SQL Server 条件连接

sql - SQL Server 中不同字符串类型之间的区别?

c# - 如何使用 Azure 辅助角色和 OWIN 扩展 SignalR

c# - Entity Framework 和 SQL Server Profiler