EF 中 lambda 表达式中的 SQL 函数“无法转换为存储表达式”/“无法解析为有效的类型或函数”

本文关键字:函数 表达式 有效 类型 存储 EF 转换 lambda SQL | 更新日期: 2023-09-27 18:35:31

我有一个SQL函数,我想使用实体框架在lambda表达式中使用它。假设SQL服务器函数是"fooFunction"。我在 EDMX 的概念模型中映射了这个函数,如下所示:

<Function Name="fooFunction" ReturnType="Edm.String">
   <Parameter Name="param1" Type="Edm.Int32" />
   <Parameter Name="param2" Type="Edm.String" />
   <DefiningExpression>
     dbo.fooFunction(param1, param2)
   </DefiningExpression>
 </Function>

有一个静态类,其中我已将此函数映射到代码,如下所示:

[EdmFunction("Model", "fooFunction")]
   public static string fooFunction(int param1, string param2)
   {
       throw new NotImplementedException("Direct calls are not supported.");
   }

但是,当我尝试调用此方法(在已编译的查询上)时,出现"无法转换为存储表达式"错误:

CompiledQuery.Compile<...> ....  .Where(fooFunction(0,"")=="value")

我已经挠头一段时间了,但我就是不明白。

有人可以在这里帮助我吗?谢谢!

编辑:哎呀,我的 EdmFunction 属性(空格)中有一个错别字:

[EdmFunction("Model", " fooFunction")]

但是,现在我得到"fooFunction 无法解析为有效的类型或函数"。-错误。

EF 中 lambda 表达式中的 SQL 函数“无法转换为存储表达式”/“无法解析为有效的类型或函数”

谢谢你的贡献,丹尼斯。但是,这不是问题的答案。我想使用 UDF,而不是存储过程。

终于想通了:我必须在存储模型中添加与 SQL UDF 的映射,如下所述: http://blogs.msdn.com/b/alexj/archive/2009/08/07/tip-30-how-to-use-a-custom-store-function.aspx

代码类似于概念模型中的映射:

<Function Name="fooFunc"
  IsComposable="true"
  Schema="dbo"
  Aggregate="false"
  BuiltIn="false"
  ReturnType="nchar">
  <Parameter Name="param1" Type="int" />
  <Parameter Name="param2" Type="nchar" />
</Function>

我不得不稍微调整一下返回类型和参数类型。我发现它们必须与映射的UDF的数据类型匹配。(本机 SQL 数据类型而不是 .NET 数据类型)

您将函数(由实体 SQL 表达式定义)与函数导入(按名称映射到数据源中的存储过程)混淆了,这必须在您的情况下使用。