我正在使用visual studio 2010和Entity Framework(EF)。我正在从数据库中检索数据并使用存储过程通过实体模型绑定到Gridview。当我在SQL查询中执行此存储过程时,它返回动态生成的列。即,执行(@PivotTableSQL)。 @PivotTableSQL包含动态生成的select语句。以下是我的存储过程代码。
但是,要创建复杂类型,请从实体模型浏览器窗口 - >添加功能导入窗口 - >复杂 - >获取列信息,“选定的存储过程不返回任何列。”消息显示。请给我一个解决方案,如何添加功能导入和获取列信息(创建复杂类型)或任何其他替代解决方案的详细信息。这个阻止了我的进一步发展。提前谢谢。
alter PROCEDURE spGetQuestGrid
(
@QID as int
)
AS
BEGIN
SET NOCOUNT OFF
SET FMTONLY OFF
Declare @optId varchar(10)
DECLARE @PivotColumnHeaders VARCHAR(MAX)
DECLARE @PivotTableSQL NVARCHAR(MAX)
set @optId = (select DISTINCT Optid from QuestOptions where QID = @QID)
SELECT @PivotColumnHeaders = COALESCE(@PivotColumnHeaders + ', [' + cast(Caption as varchar) + ']' ,
'[' + cast(Caption as varchar)+ ']')
FROM OptionsDetail where OptId = @optId
SET @PivotTableSQL = 'select * from (select Caption,Optid from OptionsDetail ) as datatable
PIVOT
( min(Optid) FOR Caption IN ( '+ @PivotColumnHeaders + '))as Colltable'
Execute (@PivotTableSQL)
END
答案 0 :(得分:0)
我认为你的问题是因为你动态执行final语句Entity Framework无法在设计时找出结果集结构。
有几种方法可以尝试克服这个问题:
更改您的sproc,以便在设计时计算出结果集结构。例如,将结果放入临时表或表变量中并从中进行选择。
创建一个与最终sproc具有相同名称和签名的虚拟sproc,其中包含一个select语句,该语句创建具有所需结构的结果集。 (例如,选择强制转换(1为int),强制转换(“a”为varchar(20))...等等。刷新实体模型并添加函数import - EF将看到结构,您可以创建实体收到结果。现在用最终版本替换数据库中的虚拟sproc。
希望有所帮助。