C# EF6无法导入存储过程

C# EF6无法导入存储过程,c#,sql-server,entity-framework,tsql,C#,Sql Server,Entity Framework,Tsql,这是存储过程的简化版本 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 [U

这是存储过程的简化版本

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使其工作吗?
提前感谢

感谢上面的评论,答案是不幸的是EF6不能很好地处理存储过程上的TMP表

解决办法之一是: 1注释掉存储过程中的所有临时表调用

2更改存储过程以返回一个假a结果,该结果具有与预期结果匹配的相同精确列名

3将存储过程导入EF6

4双击函数导入/存储过程名称

5在“编辑函数导入”对话框中,检索列并创建一个新的复杂类型,该类型将匹配伪列

6 CTRL+Save以生成所有C代码

7通过删除假结果集并使用临时表取消注释代码,重新更新存储过程

这应该可以完成任务


特别感谢那些帮我找到正确位置的人

有时将以下语句添加到存储的过程中会起作用:

set fmtonly off

但是,不要保留此语句-只在生成结果集时使用它

@marc\s我所说的是返回对话框的集合,即使单击“获取列信息”按钮,它也表示存储过程不返回任何列。如果我用一个简单的select field1,field2,field3从表1中替换存储的proc内容…这些都会显示在该对话框中。我会更新这个问题,让它更清楚。谢谢。我想问题出在临时表上。看,它不能很好地处理临时表之类的事情。我只是临时更改定义,以选择所需列名和数据类型的虚拟结果集。导入到EF,然后替换为正确的定义。为什么要将值放入临时表中?在我看来,你可以先加入用户,然后简单地选择它。@Zane我试图选择一个按最低字段值排序的限制数量的用户,然后确保获得正确的pageIndex和RecordCount,最后将其添加到平均值中。有更好的办法吗?