【问题标题】:SQL function in lambda expression in EF "cannot be translated into a store expression"/ "cannot be resolved into a valid type or function"EF 中 lambda 表达式中的 SQL 函数“无法转换为存储表达式”/“无法解析为有效类型或函数”
【发布时间】:2012-05-29 07:23:55
【问题描述】:

我有一个 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 无法解析为有效的类型或函数。”-错误。

【问题讨论】:

    标签: c# entity-framework lambda


    【解决方案1】:

    感谢您的贡献,丹尼斯。然而,这不是问题的答案。我想使用 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>
    

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2016-04-15
      • 1970-01-01
      • 2015-10-04
      • 2011-04-20
      相关资源
      最近更新 更多