我如何用sp_executesql返回特定的表列到LINQ2SQL或实体框架

本文关键字:LINQ2SQL 框架 实体 sp 何用 executesql 返回 | 更新日期: 2023-09-27 18:17:22

我有一个包含命令EXEC [sp_executesql]的存储过程,并返回带有临时表#UserDetail的结果。

我有通过LINQ2SQL或实体框架返回数据的问题。

我需要获得特定的列,并将这些列映射到c#中的业务对象。

当我在Linq2SQL中创建DataContext时,我得到错误:

The return types for the following stored procedures could not be detected

在实体框架存储过程中返回非特定列。

如何修改这个存储过程来完成这个操作?

CREATE PROC [SUPPORT].[GetUserDetail] @userId BIGINT
AS
    BEGIN
        CREATE TABLE #UserDetail
            (
              [UserId] BIGINT NOT NULL,
              [UserName] VARCHAR(50) NOT NULL,
              [Email] VARCHAR(150) NOT NULL
            )
        DECLARE @ExecStr NVARCHAR(4000) ,
            @Recompile BIT = 0;
        SELECT  @ExecStr = 'INSERT INTO #UserDetail
                ( UserId, UserName, Email
                )';
        SELECT  @ExecStr = @ExecStr
                + N'SELECT u.UserId, u.UserName, u.Email FROM dbo.[User] u WHERE 1=1';
        IF @userId IS NOT NULL
            OR @userId <> ''
            SELECT  @ExecStr = @ExecStr + N' AND (u.UserId = @userId)';
        IF @userId IS NULL
            BEGIN
                SET @Recompile = 1
            END
        IF @Recompile = 1
            BEGIN
                SELECT  @ExecStr = @ExecStr + N' OPTION(RECOMPILE)';
            END
        EXEC [sp_executesql] @ExecStr, N'@userId BIGINT', @userId = @userId;
        SELECT  ud.UserId, ud.UserName, ud.Email
        FROM    #UserDetail ud
    END

我如何用sp_executesql返回特定的表列到LINQ2SQL或实体框架

似乎根本不需要动态SQL。您提到了不每次都重新编译查询的目标,但请考虑如何实现该目标:

  • 创建临时表
  • 创建动态SQL语句(如果"必要"重新编译)
  • 正在填充临时表
  • 从临时表中选择所有数据

所以你加倍你的I/O和内存需求来节省一小部分CPU时间。您的存储过程似乎相当于:

CREATE PROC [SUPPORT].[GetUserDetail] @userId BIGINT
AS
    BEGIN
    SELECT u.UserId, u.UserName, u.Email 
    FROM dbo.[User] u 
    WHERE (@userId IS NULL OR u.UserId = @userId)
    OPTION(RECOMPILE)
END

如果这给了你你需要的结果,但似乎太慢,尝试它没有RECOMPILE,看看是否有帮助。我非常怀疑添加临时表和动态SQL仅仅通过节省偶尔的重新编译就能提高性能。