簡體   English   中英

使用LINQ從存儲過程中獲取值

[英]Using LINQ to get values from Stored Procedure

我正在使用LINQ和DataContext檢索我的數據。 我不使用實體框架。 現在我有一個不知道的存儲過程

  1. 如何提供參數和
  2. 如何定義(單個值)並從中獲取結果。

存儲過程是通過以下方式定義的:

CREATE PROCEDURE [dbo].[spGetConvertedFieldValue] 
-- Add the parameters for the stored procedure here
    @Table NVARCHAR(50),
    @Field NVARCHAR(50),
    @Key NVARCHAR(50),
    @KeyValue NVARCHAR(500)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX)

    SET @SQL = 'SELECT ' + @Field + ' FROM ' + @Table + ' WHERE ' + @Key + ' = ''' + @KeyValue + ''''

EXEC(@SQL)
END

如您所見,這是一個非常通用的存儲過程! 這樣做的原因是,我有另一個表,可以在其中輸入上述值,並且系統將能夠建立我的最終結果。

但是我有點庫存。 我已閱讀以下文章: http : //www.codeproject.com/Articles/37938/Simple-6-steps-to-use-stored-procedure-in-LINQ ,其中指定了如何調用存儲過程。 但是有一件事是,看來我至少應該能夠定義我要引用的表(步驟2)

此外,以上文章沒有描述如何添加參數。

如果可以通過不使用存儲過程來創建結果,那也是一種選擇!

好的,這是解決方法:

首先,我創建一個名為TemporaryParking的新表:

CREATE TABLE [dbo].[TemporaryParking](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Field] [nvarchar](max) NULL,
 CONSTRAINT [PK_TemporaryParking] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =     ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 10) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

接下來,我創建一個存儲過程,該過程可以對我的表進行填充並返回新插入值的ID:

CREATE PROCEDURE [dbo].[spGetConvertedFieldValue] 
-- Add the parameters for the stored procedure here
@Table NVARCHAR(50),
@Field NVARCHAR(50),
@Key NVARCHAR(50),
@KeyValue NVARCHAR(500)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'INSERT INTO TemporaryParking (Field) SELECT ' + @Field + ' FROM ' + @Table + ' WHERE ' + @Key + ' = ''' + @KeyValue + ''''

EXEC(@SQL)

RETURN @@Identity   
END

在我的應用程序中,我創建了一個.dbml文件,該文件“包含”我的存儲過程spGetConvertedFieldValue。

調用此過程時,它將從插入的值中返回Id,然后我可以創建一個簡單的LINQ語句來獲取該值:

'lets assume that I now have the Id in a variable calle tmpId

var rv = (from f in _db.TemporaryParking
         where f.Id == tmpId
         select f.Field).First();

如果需要,我什至可以通過再次刪除TemporaryParking中的值來進行清理。

謝謝Thorsten Dittmar為我指出正確的方向! 您的答案並不能解決所有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM