2012-07-11 120 views
0

我是Linq的新手,並試圖將此SQL Server存儲過程轉換爲Linq,我構建了一個Silverlight業務應用程序,需要調用此過程以返回一個網格結果。通過c調用li​​nq服務的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; 

然而,開始「工作」有錯誤,並說「無法找到一個實現......‘加入’未發現」任何人都可以幫忙翻譯?或者提供一個更好的方式來調用存儲過程並使用後面的代碼?謝謝

+4

爲什麼不把它作爲存儲過程? – Erix 2012-07-11 19:24:01

+0

,因爲我們已經爲應用程序的所有其他應用程序設置了一個完整的linq服務,但無論如何,我該如何調用存儲過程呢?我的嘗試也失敗了。 – jcc 2012-07-11 19:26:45

+0

查看[此鏈接](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

回答

3

您可以將您的存儲過程添加到實體上下文並將其作爲方法調用。

要完成此操作,您必須將存儲過程添加到實體模型。你沒有說你是如何構建模型或你使用的EF版本是什麼,但我認爲你可以繼續前進,從數據庫更新模型並添加存儲過程。

一旦在模型中擁有SP,就必須將SP轉變爲函數導入。執行此操作的方式是導航到模型瀏覽器中的存儲過程,右鍵單擊SP圖標並選擇「添加功能導入」。因爲您要返回一個複雜的結果集,所以我建議您構建一個複合類型,您將使用該類型作爲SP的結果類型。要在「添加功能導入」對話框中創建複雜類型,請單擊「獲取列信息」按鈕。這將顯示SP的返回值,因此您可以通過單擊「創建新複雜類型」按鈕來創建新的複雜類型。給它一個名字,然後單擊確定。您的功能導入現在位於模型瀏覽器的「功能導入」下。

你叫你的方式運作進口的方法是:

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結果集相同的屬性(名稱和類型)。在對話框中選擇「返回一個集合」中的Complex,

希望這會有所幫助。

+0

到目前爲止,這只是澄清,我的上下文又是什麼?如果我將其設置爲「Job」,則spSearchResults表示它未定義。 – jcc 2012-07-11 20:36:14

+0

在Job中,Job中的var query = from j,Job是你的ObjectContext(http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx),它是提供機制的對象與EF和您的數據存儲一起工作。在使用它之前是否實例化了上下文? – 2012-07-12 20:04:25

0

要使用linq調用存儲過程,只需到服務器資源管理器連接數據庫,然後選擇Stored Procedures文件夾,然後將其拖到dbml設計器文件中。您會注意到在設計器中添加了一個方法。 然後只是實例化上下文並調用你的過程。 示例: Example Linq StoredProcedures