这是存储过程的简化版本
ALTER PROCEDURE [dbo].[StoredProc1]
(
@PageIndex INT = 1,
@RecordCount INT = 20,
@Gender NVARCHAR(10) = NULL
)
AS
BEGIN
SET NOCOUNT ON ;
WITH tmp1 AS
(
SELECT u.UserId, MIN(cl.ResultField) AS BestResult
FROM [Users] u
INNER JOIN Table1 tbl1 ON tbl1.UserId = u.UserId
WHERE (@Gender IS NULL OR u.Gender = @Gender)
GROUP BY u.UserID
ORDER BY BestResult
OFFSET @PageIndex * @RecordCount ROWS
FETCH NEXT @RecordCount ROWS ONLY
)
SELECT t.UserId, t.BestResult, AVG(cl.ResultField) AS Average
INTO #TmpAverage
FROM tmp1 t
INNER JOIN Table1 tbl1 ON tbl1.UserId = t.UserId
GROUP BY t.UserID, t.BestResult
ORDER BY Average
SELECT u.UserId, u.Name, u.Gender, t.BestResult, t.Average
FROM #tmpAverage t
INNER JOIN Users u on u.UserId = t.UserId
DROP TABLE #TmpAverage
END
当我使用EF6加载存储过程,然后转到“编辑功能导入”对话框时,不会显示任何列。即使在我要求检索列之后,我也收到了SP不返回列的消息。当我从SMMS执行SP时,我得到了预期的[UserId,Name,Gender,BestResult,Average]记录列表。
任何想法如何调整存储过程或EF6才能使其工作? 提前致谢
答案 0 :(得分:1)
感谢上面的评论,答案是不幸的是,EF6无法很好地处理存储过程中的TMP表。
一种解决方法如下:
1)注释存储过程中的所有临时表调用。
2)更改存储过程以使用与预期结果匹配的完全相同的列名称返回假结果
3)将存储过程导入EF6
4)双击功能导入/存储过程名称
5)在“编辑函数导入”对话框中,检索“列”并创建与假列匹配的新复杂类型
6)CTRL + Save以生成所有C#代码
7)通过删除假结果集重新更新存储过程,并使用Temp表取消注释代码。
那应该做的。
P.S。特别感谢帮助我指向正确的地方!!!
答案 1 :(得分:0)
有时可以将以下语句添加到存储过程中:
set fmtonly off
但是,不要留下这句话 - 只在生成结果集时使用它