LINQ to SQL无法检测存储过程的返回类型

时间:2012-02-02 00:26:18

标签: linq-to-sql stored-procedures

我有一个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。

3 个答案:

答案 0 :(得分:3)

由于我忘记的原因,Linq-to-SQL将无法从返回结果集的存储过程中自动派生结果类型,除非您在将其放入Linq之前在存储过程中包含以下T-SQL行-to-SQL设计师:

SET FMTONLY OFF;

试试这个:

  1. 在proc。
  2. 中的BEGIN语句之后插入上面的代码
  3. 如果您还没有这样做,请按照之前的建议删除RETURN 0。
  4. 执行ALTER for proc。
  5. 修改您的VS.NET服务器资源管理器
  6. 将proc拖放到数据模型设计器上。
  7. 在设计器中选择proc时,“属性”窗格应显示“返回类型”(自动生成的类型)。
  8. 保存您的数据模型。
  9. 返回存储过程并注释掉SET命令:

    - 设置FMTONLY OFF;

  10. 为你的proc执行ALTER。希望我能记住为什么有必要在它达到目的后摆脱它。

答案 1 :(得分:0)

该行

  

RETURN 0

是两个案件的罪魁祸首。失去它,Linq应该能够检测你的结果集类型。

答案 2 :(得分:0)

Linq to Sql不会直接从存储过程中获取结果。而是返回ISingleResult。您必须枚举结果集以获取从存储过程返回的值。

相关问题