我在 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.
这里可能缺少什么?
我已按照此网页中的说明进行操作:
最佳答案
我是这样解决的:
将此方法添加到上下文类(继承 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/