将存储过程添加到Entity Framework

时间:2016-09-06 19:36:23

标签: c# sql-server entity-framework entity-framework-6

我有一个动态生成自己的存储过程,详细地说我要添加到where,order by子句动态。

这是我的存储过程:

ALTER PROCEDURE [dbo].[sp_GetConsultants]
    @SearchQuery VARCHAR(MAX) = NULL,
    @SortDataField VARCHAR(100),
    @SortOrder VARCHAR(4),
    @PageNum INT,
    @PageSize INT,
    @sql NVARCHAR(MAX) = NULL OUTPUT
AS
BEGIN
    SET @sql = N'

    WITH cte AS
    (
        SELECT
            ID, [NO], Firstname, Lastname, ReferanceID,
            CAST('''' AS VARCHAR(MAX)) AS ReferanceNO
        FROM 
            dbo.Consultants 
        WHERE 
            ReferanceID IS NULL

        UNION ALL

        SELECT
            c.ID, c.[NO], c.Firstname, c.Lastname, c.ReferanceID,
            CASE
               WHEN ct.ReferanceNO = ''''
                  THEN CAST(ct.[NO] AS VARCHAR(MAX))
               ELSE CAST(ct.[NO] AS VARCHAR(MAX))
            END
        FROM 
            dbo.Consultants c
        INNER JOIN 
            cte ct ON ct.ID = c.ReferanceID
    )
    SELECT * 
    FROM cte '
+ @SearchQuery
+ ' ORDER BY '
+ @SortDataField + ' ' + @SortOrder
+ ' OFFSET '+ CAST(@PageNum AS VARCHAR(20)) + ' ROW FETCH NEXT ' +CAST(@PageSize AS VARCHAR(20)) + ' ROWS ONLY'

EXEC sp_executesql @sql, N'@SearchQuery VARCHAR(MAX), @SortDataField VARCHAR(100), @SortOrder VARCHAR(4), @PageNum INT, @PageSize INT', @SearchQuery, @SortDataField, @SortOrder, @PageNum, @PageSize
END

我正在尝试将此存储过程添加到Entity Framework,但没有成功。实体框架无法为我的存储过程创建复杂类型,我点击"获取列信息"按钮,但下面的文本框显示"所选的存储过程不返回任何列"。

你知道这是什么问题吗?

P.S。如果我从@sql字符串

中删除参数,它会起作用

1 个答案:

答案 0 :(得分:2)

可能是因为您的过程中没有正确的SQL语句,Entity Framework可以通过该语句检测结果列。

解决方法是,在过程结束时放置一个SQL Select语句,该语句应该告诉Entity Framework有关结果的信息,例如在过程结束时放下以下语句并更新它

SELECT
    CAST(1 AS int) AS  ID
    ,CAST(1 AS int) AS [NO]
    ,N'Fist Name' AS Firstname
    ,N'Lasat Name' AS Lastname       
    ,CAST(1 AS int) AS ReferanceID
    ,CAST('' AS VARCHAR(MAX))  AS ReferanceNO

在此之后,进入实体框架并导入该过程,它应该正确显示列。在Entity Framework中导入SP后,返回Procedure并注释掉我们刚添加的最后一个SELECT语句。最后一条声明仅适用于实体框架,以了解SP将返回的内容。

P.S。我不确切知道列类型,因此您应该更好地更改select语句中的列类型