【问题标题】:Return stored procedure result in a list of complex type以复杂类型列表返回存储过程结果
【发布时间】:2016-07-14 14:24:56
【问题描述】:

我有以下存储过程,它调用返回多行的动态查询。

CREATE PROCEDURE [dbo].[usp_list_connections] @skip int, @take int = 50
WITH EXECUTE AS OWNER
AS
BEGIN
    IF 1 = 2    -- For EF to recognize columns
    BEGIN
        SELECT CAST(1 AS int) [Id], CAST('A' AS nvarchar(100)) [Name], CAST(1 AS bit) [Sim], CAST(1 AS bit) [Device]
    END
    DECLARE @q NVARCHAR(MAX) ='';
        SET @q = N'
        SELECT DISTINCT e.[Id], e.[Name],
        CASE
            WHEN s.[Sim] IS NULL THEN 0
            ELSE 1 END AS [Sim],
        CASE
            WHEN d.[Device] IS NULL THEN 0
            ELSE 1 END AS [Device]
        FROM [dbo].[Employee] e
            LEFT JOIN [dbo].[Sim] s ON s.[Employee] = e.[Id]
            LEFT JOIN [dbo].[Device] d ON d.[Employee] = e.[Id]
        ORDER BY e.[Name]
        OFFSET @skip ROWS
        FETCH NEXT @take ROWS ONLY;'
    SET @q = REPLACE(@q, '@skip', @skip);
    SET @q = REPLACE(@q, '@take', @take);   

    EXEC sp_executesql @q;
END

我将过程导入到 EF 并将其映射到复杂类型。当我尝试使用以下代码通过 EF 运行该过程时

var result = db.usp_list_connections(0,50); 

它返回如下错误消息:

“一个查询的结果不能被枚举多次。”

我做错了什么?如何将此存储过程的结果集存储在变量中? 提前致谢。

【问题讨论】:

    标签: c# entity-framework stored-procedures


    【解决方案1】:

    尝试通过调用ToList() 来具体化您的查询可能会解决您的问题:

    var result = db.usp_list_connections(0,50).ToList();
    

    【讨论】:

    • 当我尝试此操作时,我收到以下错误消息:EntityFramework.dll 中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:“Sim”属性usp_list_connections_Result' 无法设置为 'System.Int32' 值。您必须将此属性设置为“System.Boolean”类型的非空值。
    • @tatgergo 确保您的 DatabaseContext 连接到正确的数据库。并且您的架构和实体匹配。
    • 我检查过,它们是匹配的。我连接到正确的数据库。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2015-06-03
    • 2013-06-21
    相关资源
    最近更新 更多