1

LINQ と DataContext を使用してデータを取得しています。Entity Framework は使用しません。そして今、私は知らないストアドプロシージャを持っています

  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ストアドプロシージャを呼び出す方法が指定されています。しかし、1 つのことは、参照しているテーブルを少なくとも定義できるように思われることです (ステップ 2)。

さらに、上記の記事では、引数を追加する方法について説明していません。

オプションでもあるストアドプロシージャを使用せずに結果を作成することが可能であれば!

4

1 に答える 1

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

私のアプリケーションでは、ストアド プロシージャ spGetConvertedFieldValue を「含む」.dbml ファイルを作成しました。

このプロシージャを呼び出すと、挿入された値から 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に感謝します!ただし、あなたの答えはすべてのトリックを実行しませんでした。

于 2013-09-24T08:07:30.293 に答える