我是Linq的新手,並試圖將此SQL Server存儲過程轉換爲Linq,我構建了一個Silverlight業務應用程序,需要調用此過程以返回一個網格結果。通過c調用linq服務的SQL Server存儲過程#
我有多個參數,用戶可以用來搜索特定的部分。他們通過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 ([email protected]=0 OR
H2.HeadingRowID = @Header2)
OR ([email protected]=0 OR
H3.HeadingRowID = @Header3)
OR ([email protected]=0 OR
H4.HeadingRowID = @Header4))
AND (((@UDAC1 = '' AND @UDAC2 = '' AND @UDAC3 = '' AND @UDAC4 = '') OR
udac1.UDACRowID = @UDAC1)
OR ([email protected]=0 OR
udac2.UDACRowID = @UDAC2)
OR ([email protected]=0 OR
udac3.UDACRowID = @UDAC3)
OR ([email protected]=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;
然而,開始「工作」有錯誤,並說「無法找到一個實現......‘加入’未發現」任何人都可以幫忙翻譯?或者提供一個更好的方式來調用存儲過程並使用後面的代碼?謝謝
爲什麼不把它作爲存儲過程? – Erix 2012-07-11 19:24:01
,因爲我們已經爲應用程序的所有其他應用程序設置了一個完整的linq服務,但無論如何,我該如何調用存儲過程呢?我的嘗試也失敗了。 – jcc 2012-07-11 19:26:45
查看[此鏈接](http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures。 aspx),你實際上可以從'DBContext' – MilkyWayJoe 2012-07-11 19:27:27