在LINQ查询中调用SQL Server UDF

时间:2018-04-19 18:55:10

标签: c# entity-framework-6 linq-to-entities user-defined-functions edmx

我在SQL Server中有这个UDF:[dbo]。[ObtieneEdad]

EDMX文件中的此定义:

<Function Name="ObtieneEdad" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" ReturnType="int">
  <Parameter Name="fechaNacimiento" Type="datetime" Mode="In" />
</Function>

类中的静态方法:

    [EdmFunction("ControlVisitas3Model.Store", "ObtieneEdad")]
    public static int? ObtieneEdad(DateTime fechaNacimiento)
    {
        throw new NotSupportedException("Direct calls are not supported.");
    }

最后,我试图在这个查询中使用:

personas = personas.Where(p => !p.PersonaFechaNacimiento.HasValue ? false : DataWare.Persona.ObtieneEdad(p.PersonaFechaNacimiento.Value) >= edadMinima && DataWare.Persona.ObtieneEdad(p.PersonaFechaNacimiento.Value) <= edadMaxima);

“personas”是IQuerable。

运行该查询时,抛出此异常:

LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] ObtieneEdad(System.DateTime)' method, and this method cannot be translated into a store expression.

这里可能缺少什么?

我已按照此网页上的说明操作:

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题:

  • 将此方法添加到上下文类(继承DbContext):

    [DbFunction("ControlVisitas3Model.Store", "ObtieneEdad")]
    public int ObtieneEdad(DateTime fechaNacimiento)
    {
        throw new NotImplementedException();
    }
    
  • 这样叫:

    personas = personas.Where(p => p.PersonaFechaNacimiento.HasValue && db.ObtieneEdad(p.PersonaFechaNacimiento.Value) >= edadMinima && db.ObtieneEdad(p.PersonaFechaNacimiento.Value) <= edadMaxima);
    

此致

的Jaime