0

私は Linq を初めて使用し、この SQL Server ストアド プロシージャを Linq に変換しようとしています。Silverlight ビジネス アプリを構築しており、このプロシージャを呼び出して結果のグリッドを返す必要があります。

ユーザーが特定の作品を検索するために使用できる複数のパラメーターがあります。ユーザーは UI を介して検索を絞り込み、検索ボタンを押すと、コード ビハインドがすべての引数を受け取り、ストアド プロシージャを呼び出す必要がある Linq サービスに送信します。

これがストアドプロシージャです。

ALTER PROCEDURE dbo.spSearchResults
@PieceType      nvarchar(6) =  '',
@FileType       nvarchar(3) = '',
@Market     nvarchar(6) = '',
@PieceNumber        nvarchar(6) = '',
@Header1    nvarchar(50) = '',
@Header2    nvarchar(50) = '',
@Header3    nvarchar(50) = '',
@Header4    nvarchar(50) = '',
@JobNumber      nvarchar(50)=' ',
@bShowInActive  BIT = 0,
@UDAC1      nvarchar(50) = '',
@UDAC2      nvarchar(50) = '',
@UDAC3      nvarchar(50) = '',
@UDAC4      nvarchar(50) = ''   
AS
BEGIN
SET NOCOUNT ON

SELECT J.* 
FROM Job J
  LEFT JOIN JobHeading H1 (NOLOCK) ON J.[JobNumber] =  H1.[JobID]
  LEFT JOIN JobHeading H2 (NOLOCK) ON J.[JobNumber] =  H2.[JobID]
  LEFT JOIN JobHeading H3 (NOLOCK) ON J.[JobNumber] =  H3.[JobID]
  LEFT JOIN JobHeading H4 (NOLOCK) ON J.[JobNumber] =  H4.[JobID]
  LEFT JOIN JobUDAC udac1 (NOLOCK) ON J.[JobNumber] = udac1.[JobID]
  LEFT JOIN JobUDAC udac2 (NOLOCK) ON J.[JobNumber] = udac2.[JobID]
  LEFT JOIN JobUDAC udac3 (NOLOCK) ON J.[JobNumber] = udac3.[JobID]
  LEFT JOIN JobUDAC udac4 (NOLOCK) ON J.[JobNumber] = udac4.[JobID]
WHERE ((@PieceType = '') OR (PieceType = @PieceType))
  AND ((@FileType = '') OR (FileType = @FileType))
  AND ((@Market = '') OR (Market = @Market))
  AND ((@PieceNumber = '') OR (PieceNumber = @PieceNumber))
  AND ((@JobNumber = '') OR (JobNumber = @JobNumber))
  AND (J.IsActive=1 OR @bShowInActive = 1)
  AND (((@Header1 = '' AND @Header2 = '' AND @Header3 = '' AND @Header4 = '') OR 
        H1.HeadingRowID = @Header1)
    OR (--@Header2=0 OR 
        H2.HeadingRowID = @Header2 )
    OR (--@Header3=0 OR 
        H3.HeadingRowID = @Header3)
    OR (--@Header4=0 OR 
        H4.HeadingRowID = @Header4))
  AND (((@UDAC1 = '' AND @UDAC2 = '' AND @UDAC3 = '' AND @UDAC4 = '') OR 
        udac1.UDACRowID = @UDAC1)
    OR (--@Header2=0 OR 
        udac2.UDACRowID = @UDAC2 )
    OR (--@Header3=0 OR 
        udac3.UDACRowID = @UDAC3)
    OR (--@Header4=0 OR 
        udac4.UDACRowID = @UDAC4))

Linq では、特定の変換を行う必要があることがわかりました。これが私の試みです。

var query = from j in Job
                    join JobHeading H1 in Job on headingRowID1 equals H1
                    join JobHeading H2 in Job on headingRowID2 equals H2
                    join JobHeading H3 in Job on headingRowID3 equals H3
                    join JobHeading H4 in Job on headingRowID4 equals H4
                    join JobUDAC udac1 in Job on udacRowID1 equals udac1
                    join JobUDAC udac2 in Job on udacRowID2 equals udac2
                    join JobUDAC udac3 in Job on udacRowID3 equals udac3
                    join JobUDAC udac4 in Job on udacRowID4 equals udac4
                    join PieceType in db on piece equals PieceType
                    join JobFileType in db on filetype equals JobFileType
                    join Book in db on market equals Book
                    join PieceNumber in db on pieceNumber equals PieceNumber
                    join JobNumber in db on jobNumber equals JobNumber
                    join Job in db on FindJobs equals db
                    where ((piece = string.Empty) || (PieceType = piece))
                      && ((filetype = string.Empty) || (JobFileType = filetype))
                      && ((market = string.Empty) || (Book = market))
                      && ((pieceNumber = string.Empty) || (PieceNumber = pieceNumber))
                      && ((jobNumber = string.Empty) || (JobNumber = jobNumber))
                      && (showInActive = true)
                      && ((((headingRowID1 = string.Empty) + (headingRowID2 = string.Empty) + (headingRowID3 = string.Empty) + (headingRowID4 = string.Empty)) ||
                            H1.HeadingRowID = headingRowID1)
                        || (H2.HeadingRowID = headingRowID2)
                        || (H3.HeadingRowID = headingRowID3)
                        || (H4.HeadingRowID = headingRowID4))
                      && ((((udacRowID1 = string.Empty) + (udacRowID2 = string.Empty) + (udacRowID3 = string.Empty) + (udacRowID4 = string.Empty)) ||
                            udac1.UDACRowID = udacRowID1)
                        || (udac2.UDACRowID = udacRowID2)
                        || (udac3.UDACRowID = udacRowID3)
                        || (udac4.UDACRowID = udacRowID4))
                    select j.Job;
        return query;

ただし、最初の「Job」にはエラーがあり、「could not find an implementation ... 'join' not found」と表示されています。翻訳を手伝ってくれる人はいますか? または、コード ビハインドでストアド プロシージャを呼び出すより良い方法を提供しますか? ありがとう

4

2 に答える 2

3

ストア プロシージャをエンティティ コンテキストに追加し、それをメソッドとして呼び出すことができます。

これを実現するには、ストア プロシージャをエンティティ モデルに追加する必要があります。モデルをどのように構築しているか、または使用している EF のバージョンはわかりませんが、先に進んで DB からモデルを更新し、ストア プロシージャを追加できると思います。

モデルに SP を作成したら、SP を Function Import に変換する必要があります。これを行う方法は、モデル ブラウザーのストア プロシージャに移動し、SP アイコンを右クリックして [関数インポートの追加] を選択することです。複雑な結果セットを返すため、SP の結果の型として使用する複合型を作成することをお勧めします。[関数インポートの追加] ダイアログで複合型を作成するには、[列情報の取得] ボタンをクリックします。これにより、SP の戻り値が表示されるため、[新しい複合型の作成] ボタンをクリックして新しい複合型を作成できます。名前を付けて、[OK] をクリックします。関数のインポートは、モデル ブラウザーの [関数のインポート] の下に表示されます。

関数 import メソッドを呼び出す方法は次のとおりです。

var result = context.spSearchResults(Your list of parameters...);

これによりSPが実行され、「結果」には複合型の型のオブジェクトのリストが表示されます。

いくつかの参照:

http://msdn.microsoft.com/en-us/library/bb896231.aspx

http://msdn.microsoft.com/en-us/library/ee534438.aspx

完成させるために: 複合型を追加する他の方法は、モデル ブラウザーで [複合型] に移動し、右クリックして [複合型の作成] を選択します。そこで、SP の結果セットと同じプロパティ (名前と型) を持つ複合型を定義する必要があります。ダイアログ ボックスで、[Returns a Collection of] で [Complex] を選択します。

お役に立てれば。

于 2012-07-11T20:07:30.737 に答える
0

linqを使用してストアドプロシージャを呼び出すには、サーバーエクスプローラーに移動してデータベースに接続し、[ストアドプロシージャ]フォルダーを選択して、dbmlデザイナーファイルにドラッグします。デザイナにメソッドが追加されていることに注意してください。次に、コンテキストをインスタンス化して、プロシージャを呼び出します。例: LinqStoredProceduresの例

于 2012-07-11T22:11:02.840 に答える