C# EF中lambda表达式中的SQL函数;无法转换为存储表达式";/&引用;无法解析为有效的类型或函数;

C# EF中lambda表达式中的SQL函数;无法转换为存储表达式";/&引用;无法解析为有效的类型或函数;,c#,entity-framework,lambda,C#,Entity Framework,Lambda,我有一个SQL函数,我想在使用实体框架的lambda表达式中使用它。让我们假设SQL server函数是“fooFunction”。我已将此功能映射到EDMX的概念模型中,如下所示: <Function Name="fooFunction" ReturnType="Edm.String"> <Parameter Name="param1" Type="Edm.Int32" /> <Parameter Name="param2" Type="Edm.Str

我有一个SQL函数,我想在使用实体框架的lambda表达式中使用它。让我们假设SQL server函数是“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.");
   }
但是,当我尝试调用此方法(在已编译查询上)时,会出现“无法转换为存储表达式”错误:


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

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

感谢您的贡献,Dennis。然而,这并不是问题的答案。我想使用UDF,而不是存储过程

最终解决了:我必须在存储模型中添加到SQL UDF的映射,如下所述:

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

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


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

不幸的是,您的评论中的链接是404的,但我找到了另一个stackoverflow答案来回答这个问题:
[EdmFunction("Model", " fooFunction")]
<Function Name="fooFunc"
  IsComposable="true"
  Schema="dbo"
  Aggregate="false"
  BuiltIn="false"
  ReturnType="nchar">
  <Parameter Name="param1" Type="int" />
  <Parameter Name="param2" Type="nchar" />
</Function>