[原創] Linq to SQL 之Stored Procedure應用問題與解決方案(分頁代碼為例)(是否是Microsoft Bug)

來源:互聯網
上載者:User

本文只代表作者在一定階段的認識與理解。

一.寫作前提

  最近在一個項目中使用到了Linq to SQL,Linq to SQL提供了對Table、Stored Procedure及Function等的應用,對於Stored Procedure而言,如果在你的Stored Procedure可以返回一個資料集合的時候,Linq to SQL為自動的為其產生一個相應的強型別結果集對象,之後在我們的Project中方便的引用。前兩天我的Project中遇到了一個特別奇怪的問題,就是在我的Stored Procedure中使用了一個temp表,然後再用select語句select這個temp表中的資料,可Linq to SQL對這個Stored Procedure給出的並不是一個強型別的結果集,而是一個int型,真是讓人摸不著頭腦,下面我們就來分析一下這個問題,並提出我的一個不合適的解決方案,並尋求更好的解決方案。

二.Stored ProcedureLinq to SQL中的結果分析 

   我們先來分析有問題的Stored Procude,表1所示:

圖表1:Stored Procedure1定義

-- ============================================
-- Author: Xiong Wei
-- Create date: 22 May 2010
-- Description: Search group manage
-- =============================================
CREATE PROCEDURE [dbo].[SP_TEST_ONE]
(
@p_sort_exprission nvarchar(50),
@p_paging_number int,
@p_paging_size int,
@p_total_count int output
)
AS

BEGIN

SELECT S.SchoolName,C.*,
ROW_NUMBER() OVER(ORDER BY C.Oid ASC)
AS ROW_INDEX
INTO #TEMP
FROM T_COURSE AS C
INNER JOIN T_SCHOOL AS S ON C.SchoolOid = S.Oid

SET @p_total_count=@@ROWCOUNT

SELECT * FROM #TEMP
WHERE ROW_INDEX>=@p_paging_number*@p_paging_size+1 AND ROW_INDEX<@p_paging_number*@p_paging_size+1+@p_paging_size
DROP TABLE #TEMP
END
RETURN

 

 

 

  能過上面的代碼,我們可以看出其實它最後取出的應該是#TEMP表中經過分布手的記錄的集合。Ok,之後我們把這個Stored Procedure 放到Linq to SQL中,我們來看看他返回的是什麼結果集,表2所示。

圖表2:Stored Procedure1返回結果

 

  是不是很奇怪,因為它返回的是一個int型,而不是資料集合。

  下面我們再來看另外一個Stored Procedure,表3所示。

圖表3:Stored Procedure2 定義

-- =============================================
-- Author: Xiong Wei
-- Create date: 22 May 2010
-- Description: Search group manage
-- =============================================
CREATE PROCEDURE [dbo].[SP_TEST_TWO]
(
@p_sort_exprission nvarchar(50),
@p_paging_number int,
@p_paging_size int,
@p_total_count int output
)
AS

BEGIN

SELECT S.SchoolName,C.*,
ROW_NUMBER() OVER(ORDER BY C.Oid ASC)
AS ROW_INDEX
FROM T_COURSE AS C
INNER JOIN T_SCHOOL AS S ON C.SchoolOid = S.Oid

SET @p_total_count=@@ROWCOUNT
END
RETURN

 

               

  先我們不說圖表3定義的Stored Procedure返回的是什麼類型,只從功能上來說它與圖表1定義只是返回結果的結果資料不同而已,返回的結果類型是相同,但是我們來看看Linq  to SQL中它返回是不是一個int型呢?Ok,我們來看看圖表4中給出的結果。

圖表4:Stored Procedure2 返回結果

 

               

  在Stored Procedure2中,Linq to SQL產生了一個強型別的結果集SP_TEST_TWOResult ,但是從選擇結果上來說,Stored Procedure1和Stored Procedure2返回的是相同類型的結果,但是在Linq to SQL中卻是不同的類型。

三.問題的解決方案 

  對於此問題的解決方案,我上網查了一遍,沒有直接的解決方案。然後我分析兩個Stored Procedure在Database輸出的結果類型應該都是一樣的,所以我想是否可以使用Stored Procedure2產生所需要的強型別,然後再用Stored Procedure1中的代碼來替代Stored Procedure2中的代碼 ,於是我試了一下,結果發現是可以的,這也就是證明了Stored Procedure1和Stored Procedure2的執行結果是相同的,但在Linq to SQL 卻產生了不同的類型。我不知道這算不算是Microsoft在Linq to SQL上的一個bug,還請 “有緣人”指點。

四.總結 

  雖然上面的代碼可以解了我在項目中現存的問題,但是我相信這並非是最好的解決方案並且存在很多問題。比如說,如果在輸出的結果集中多加一個欄位,那麼我們就需要重建這個強型別,那麼我們就需要為這個結果集重新建立一個Stored Procedure,所以這是不可取的。在有空之餘,我將再研究一下,同時也希望有知道人的可以指點一下,在此表示感謝。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.