我有一个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.");
}
但是,当我尝试调用此方法时(在编译查询上),我得到&#34;无法转换为商店表达式&#34;错误:
CompiledQuery.Compile<...> .... .Where(fooFunction(0,"")=="value")
我一直在摸不着头脑,但我还是没有得到它。
有人可以帮我吗?谢谢!
编辑:哎呀,我的EdmFunction属性(空格)中有一个拼写错误:
[EdmFunction("Model", " fooFunction")]
但是,现在我得到&#34; fooFunction无法解析成有效的类型或函数。&#34; -error。
答案 0 :(得分: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数据类型)
答案 1 :(得分:0)
您将Function(由实体SQL表达式定义)与FunctionImport(按名称映射到数据源中的存储过程)混淆,必须在您的情况下使用。< / p>