我有一个LINQ无法处理的简单存储过程。我尝试过使用和不使用临时表的变体,但总是得到相同的结果:“无法检测到以下存储过程的返回类型。”
以下是我尝试的两种变体:
CREATE PROCEDURE GetBOQuestions @JobId int AS
BEGIN
SELECT Id, ExemptionCode, Prose [Question], InputType, DisplayOrder
FROM Assessor.FLSA.BlackOpsQuestion Q
LEFT JOIN Common.dbo.FName F ON F.ajblVIDP = Q.ExemptionCode
WHERE ajblERI = @JobId OR Q.ExemptionCode IS NULL
RETURN 0;
END
和...
CREATE PROCEDURE GetBOQuestions @JobId int AS
BEGIN
DECLARE @TempTable TABLE
(
Id VARCHAR(50),
ExemptionCode VARCHAR(10),
Question VARCHAR(1000),
InputType VARCHAR(20),
DisplayOrder INT
)
INSERT INTO @TempTable (Id, ExemptionCode, Question, InputType, DisplayOrder)
SELECT Id, ExemptionCode, Prose [Question], InputType, DisplayOrder
FROM Assessor.FLSA.BlackOpsQuestion Q
LEFT JOIN Common.dbo.FName F ON F.ajblVIDP = Q.ExemptionCode
WHERE ajblERI = @JobId OR Q.ExemptionCode IS NULL
SELECT Id, ExemptionCode, Question, InputType, DisplayOrder FROM @TempTable ORDER BY DisplayOrder
RETURN 0;
END
我在Linq-to-SQL(.NET 4.0)和Entity Framework中尝试了这个。 EF甚至没有看到SP。
答案 0 :(得分:3)
由于我忘记的原因,Linq-to-SQL将无法从返回结果集的存储过程中自动派生结果类型,除非您在将其放入Linq之前在存储过程中包含以下T-SQL行-to-SQL设计师:
SET FMTONLY OFF;
试试这个:
返回存储过程并注释掉SET命令:
- 设置FMTONLY OFF;
为你的proc执行ALTER。希望我能记住为什么有必要在它达到目的后摆脱它。
答案 1 :(得分:0)
该行
RETURN 0
是两个案件的罪魁祸首。失去它,Linq应该能够检测你的结果集类型。
答案 2 :(得分:0)
Linq to Sql不会直接从存储过程中获取结果。而是返回ISingleResult
。您必须枚举结果集以获取从存储过程返回的值。