存储过程的 Linq2SQL 中没有返回类型
Posted
技术标签:
【中文标题】存储过程的 Linq2SQL 中没有返回类型【英文标题】:No return type in Linq2SQL for stored procedure 【发布时间】:2021-03-11 08:28:13 【问题描述】:我已经用 SQL 编写了一个存储过程,并希望在我的 Linq2SQL 设计器中使用它。因此,我像往常一样将它从 Visual Studio (2019) 中的服务器资源管理器拖放到我的设计器中,但此过程的返回类型为 None。 似乎很清楚,当我查看我的 SQL 过程时没有返回值,因为它使用 EXEC 执行查询,但我可以在 SQL Server Management Studio 中看到结果。
这是我的存储过程:
CREATE PROCEDURE [dbo].[ret_VAL]
@ITEMNR nvarchar(255),
@COLUM_NAME nvarchar(255)
AS
DECLARE @query AS NVARCHAR(max)
SET @query = N'SELECT ' + @COLUM_NAME + ' AS VALUE FROM [PROD].[dbo].[MMView] Where ITEMNUMBER like ''' + @ITEMNR + ''''
EXEC (@query)
GO
当我在 SSMS 中运行存储过程时,我得到了一个结果,但我无法在 Linq2SQL 中使用它。当然,我可以将它拖放到我的 Linq2SQL 设计器中,但它没有返回类型。有人可以告诉我这里缺少什么,以获得返回类型(返回值)吗?
【问题讨论】:
【参考方案1】:L2S 设计器无法确定动态执行查询的返回类型。
您在“@colum_name”参数中传递的所有列的数据类型是否相同?
如果是这样,如果您暂时将存储的过程更改为:
CREATE PROCEDURE [dbo].[ret_VAL]
@ITEMNR nvarchar(255),
@COLUM_NAME nvarchar(255)
AS
SELECT top 1 somecolumn AS VALUE FROM [PROD].[dbo].[MMView] Where 1=0
GO
...然后将其添加到 L2S 设计器,然后它应该在 datacontext 中获得正确的返回类型定义。然后您可以将存储的过程更改回原始定义。
但是,如果列是不同的数据类型,那么这将不起作用,因为定义只会匹配您在临时更改的存储过程中使用的列。
【讨论】:
哦,真是个好技巧。 :) 这很有帮助。但正如你所说。有一列具有另一种数据类型,然后其他列具有。这个是十进制类型,其他的是char类型。因此,当我传入具有十进制作为数据类型的列的名称时,我得到了一个强制转换异常。 是的,如果有不同的数据类型,那么您需要为每种类型定义一个 SP。 ...或者可能更容易完全跳过 SP 并将其作为 linq 查询直接针对表/视图进行。如果目标是让它有点动态并在运行时选择列,那么 System.Linq.Dynamic 可能是一个选项:weblogs.asp.net/scottgu/… 我将忽略这一列,因为我不需要它。感谢上帝,只有一列具有不同的类型。 :D 我会把你的答案标记为正确答案。 顺便说一句,感谢您提供的非常有趣的链接。 谢谢 :) 该链接已有几年的历史,因此某处可能有较新版本的 System.Linq.Dynamic。但是,那个原始的仍然很好用,所以我仍然在很多地方使用它。以上是关于存储过程的 Linq2SQL 中没有返回类型的主要内容,如果未能解决你的问题,请参考以下文章
Linq2Sql - 存储复杂的Linq查询以便将来动态执行 - 原始文本 - 可能吗?