EF无法从#temp表中select从存储过程select返回模式

假设如下:

CREATE PROCEDURE [MySPROC] AS BEGIN CREATE TABLE #tempSubset( [MyPrimaryKey] [bigint] NOT NULL, [OtherColumn] [int] NOT NULL) INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn) SELECT SomePrimaryKey, SomeColumn FROM SomeHugeTable WHERE LimitingCondition = true SELECT MyPrimaryKey, OtherColumn FROM #tempSubset WHERE SomeExpensiveCondition = true END 

当我生成一个函数导入或映射返回types时,EF不会生成一个复杂types或告诉我:

所选的存储过程或函数不返回任何列

如何克服这一点?

其他答案build议使用表variables (不会这样做是出于性能原因) 伪造返回模式和注释掉真正的存储过程 ,其他build议做类似的意见 …但必须有一种方法来做到这一点,而不必添加不必要的开销或要求我打破存储过程来更新模型?

 CREATE PROCEDURE [MySPROC] AS BEGIN --supplying a data contract IF 1 = 2 BEGIN SELECT cast(null as bigint) as MyPrimaryKey, cast(null as int) as OtherColumn WHERE 1 = 2 END CREATE TABLE #tempSubset( [MyPrimaryKey] [bigint] NOT NULL, [OtherColumn] [int] NOT NULL) INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn) SELECT SomePrimaryKey, SomeColumn FROM SomeHugeTable WHERE LimitingCondition = true SELECT MyPrimaryKey, OtherColumn FROM #tempSubset WHERE SomeExpensiveCondition = true END 

为结果集提供人造数据合同是处理问题的最简单,最干净和最快捷的方式。 SSIS中的数据源控件也存在同样的问题。 .NET将从查询的不可达“合同”部分读取结果集并提供复杂types的元数据。 没有性能影响,也没有必要注释掉实际工作的SQL。

将此添加到存储过程定义的顶部:

 SET FMTONLY OFF 

允许模型从临时表中推断模式,而不会出现问题。 作为奖励,它不需要额外的维护合同。

例:

 SET FMTONLY OFF CREATE TABLE #tempTable ( ... ) ... SELECT * FROM #tempTable 

解决scheme1使用表variables而不是临时表。

解决scheme2closures设置FMTONLY; SQL命令,您将获得列信息以创build新的复杂types。

解决scheme3这不是一个好方法,但这是一个非常简单的方法。 只要添加一个带有哑元数据的select语句,它将不会执行,因为1 = 0。

你可以查看这个链接的细节