c# - 在 LINQ 查询中调用 SQL Server UDF

标签 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://learn.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions

最佳答案

我是这样解决的:

  • 将此方法添加到上下文类(继承 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);
    

问候

杰米

关于c# - 在 LINQ 查询中调用 SQL Server UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928303/

相关文章:

c# - 创建多个模型时出现 MVC 问题

c# - 与模型状态错误消息相对的成功消息

entity-framework - 如何在 Entity Framework 中执行SqlSqlCommand而不将其包含在事务中

c# - Linq to entities 无法处理 string.split() 函数

C# .Net Linq 添加带有标识字段的新记录

c# - DotNetNuke 使用自定义 url 向模块菜单添加操作

c# - 读取 MNIST 数据库

c# - 如何使用 Entity Framework 6 将单个属性映射为多个复合外键的一部分?

c# - Entity Framework 6 的动态 MySQL 数据库连接

Linq - 如何查询特定列并返回列表