LINQ'System.String'不是映射存储过程方法的有效返回类型。 SQL函数

时间:2013-05-29 13:27:38

标签: .net linq sql-function

我正在尝试在LINQ中使用SQL用户定义的函数。我有以下功能:

CREATE FUNCTION [TestSqlFunction] ( @strText VARCHAR(1000) )
RETURNS VARCHAR(1000)
AS 
    BEGIN
        RETURN @strText
    END
GO

这导致以下代码:

<DateTimeVerification(DateTimeVerificationState.Verified)> _
<[Function](Name:="dbo.TestSqlFunction")> _
Friend Function TestSqlFunction_Linq(
<Parameter(Name:="strText", DbType:="varchar")>ByVal pstrText As String) As String
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), 
pstrText)
Return CType(result.ReturnValue, String)
End Function

执行此代码时,会抛出以下异常:

System.InvalidOperationException
'System.String' is not a valid return type for a mapped stored procedure method.
   at System.Data.Linq.SqlClient.QueryConverter.TranslateStoredProcedureCall(MethodCallExpression mce, MetaFunction function)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMappedFunctionCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
   at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
   at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
   at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
   at DataContext.TestSqlFunction_Linq(String pstrText) 

它适用于具有整数作为返回值的函数。例外情况是“映射存储过程方法”,我认为这很奇怪,因为它是用户定义的函数。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

<DateTimeVerification(DateTimeVerificationState.Verified)> _
<[FunctionAttribute](Name:="dbo.TestSqlFunction", IsComposable:=True)> _
Friend Function TestSqlFunction_Linq(
<Parameter(Name:="strText", DbType:="varchar")>ByVal pstrText As String) As String
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod,     MethodInfo), 
pstrText)
Return CType(result.ReturnValue, String)
End Function

回答我自己的问题:您需要使用<[function]>属性,而不是使用<[FunctionAttribute]>属性。并且添加IsComposable:=True部分会有所不同。

答案 1 :(得分:0)

据我所知,您可以在DBML上拖放Sql存储过程并将其用作c#中的方法。您可以在SP中使用UDF,而不是直接在DBML文件上使用。 尝试将一个转换为存储过程而不是UDF。