我如何用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
似乎根本不需要动态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仅仅通过节省偶尔的重新编译就能提高性能。