2009-12-27 56 views
2

我最近開始使用LINQ to SQL來上班,不知道如何獲得多行作爲執行存儲過程的結果,這裏有一個簡單的SP我想工作:如何使用Linq to SQL從存儲過程中檢索多行?

CREATE PROCEDURE gsp_ftsmultiple 
    @SearchKey varchar(100) 
AS 

BEGIN 

    SET NOCOUNT ON; 

    SELECT Label, theContent 
    FROM FtsTest 
    WHERE FREETEXT(theContent, @SearchKey) 

END 

從執行該SP管理工作室沒問題,但生成的上下文類中的相應方法返回一個int值,我不知道如何獲得實際的行,嘗試使用OUT參數,但它們只能返回一個結果。

回答

1

我認爲你所需要做的就是創建一個與你的結果模式相匹配的類,並確保dbml中的函數將它作爲返回類型。

看到here MSDN上

+0

確切地說,它的工作原理,謝謝 – sforester 2009-12-27 13:19:37

-1

你可能會更好的只是運行查詢本身,看到你沒有做任何事情需要一個過程。只要確保你正確地逃避搜索鍵。

+1

僅供參考:最好留下評論。 – 2009-12-27 05:03:53

+3

感謝您的回覆,但由於我想使用全文搜索,Linq to SQL沒有直接支持此功能,因此我必須使用sp。 – sforester 2009-12-27 05:07:10

+0

看到我的答案,這是因爲Visual Studio調用SP並嘗試生成LINQ 2 SQL代碼時,FREETEXT()失敗。 – 2009-12-27 06:29:28

0

嘗試創建全文謂詞作爲包裝函數而不是sprocs,如this。爲我工作。

+0

感謝,試圖使用一個函數 – sforester 2009-12-27 13:19:00

0

sqlmetal生成此過程中的代碼,它沒有通過用於查詢工作的一個有效參數。

嘗試把這樣的事情對你的頂部SP:

IF @SearchKey IS NULL OR LEN(@SearchKey) = 0 
BEGIN 
    SELECT N'' AS Label, N'' AS theContent WHERE 1 = 0 
END 

[...] 

現在會推斷出2個nvarchar列是通常的輸出,並生成相應的代碼

PS。代碼把我的頭,未經測試

邁克

+0

謝謝,也是新的數據庫,不太適合你,但我會盡力找出答案。 – sforester 2009-12-27 13:22:19

0

我測試下面的代碼片段,它能正常工作。如果你把生成的代碼放在這裏,我可以看看並檢查問題出在哪裏。無論如何,您可以創建一個與生成的數據上下文類同名的部分類,並手動添加所需的方法,如下所示。

public partial class FooDataContext: System.Data.Linq.DataContext 
{ 

    [System.Data.Linq.Mapping.Function(Name = "GetFoo")] 
    public System.Data.Linq.ISingleResult<Foo> GetFoo() 
    { 
     System.Data.Linq.IExecuteResult res = base.ExecuteMethodCall(this, (System.Reflection.MethodInfo)System.Reflection.MethodInfo.GetCurrentMethod()); 
     return (System.Data.Linq.ISingleResult<Foo>)res.ReturnValue; 
    } 

} 
+0

謝謝,它的工作原理 – sforester 2009-12-27 13:20:15

相關問題