使用LINQ从存储过程中获取值

时间:2013-09-23 11:45:08

标签: c# sql linq stored-procedures

我正在使用LINQ和DataContext来检索我的数据。我不使用实体框架。现在我有一个我不知道的存储过程

  1. 如何提供参数和
  2. 如何定义和获取(单值​​)的结果。
  3. 存储过程以这种方式定义:

    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)

    此外,上面的文章没有描述如何添加我的论点。

    如果可以通过不使用也是一个选项的存储过程来创建结果!

1 个答案:

答案 0 :(得分:0)

好的,这是解决方法:

首先,我创建一个名为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指出我正确的方向!你的答案并没有完成整个技巧。