私は 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」と表示されています。翻訳を手伝ってくれる人はいますか? または、コード ビハインドでストアド プロシージャを呼び出すより良い方法を提供しますか? ありがとう