如何从EF LINQ查询调用DB函数

本文关键字:调用 DB 函数 查询 LINQ EF | 更新日期: 2023-09-27 18:09:01

在我的数据库中,我定义了一些函数,假设它称为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);

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

是否有可能以某种方式调用已经在DB中创建的函数?或者我需要这样写:

((IObjectContextAdapter) context).ObjectContext.CreateQuery

并手动编写查询?

如何从EF LINQ查询调用DB函数

首先,必须首先在数据库中将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>

现在你可以像这样将这个函数绑定到模型中的一个方法:

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

你现在可以在标准的LINQ查询中使用这个方法。

进一步阅读

  • 如何调用自定义数据库函数

使用sql查询实体。例如查看msdn: http://msdn.microsoft.com/en-us/data/jj592907.aspx