簡體   English   中英

LINQ-to-SQL:返回單個標量值的存儲過程?

[英]LINQ-to-SQL: Stored Procedure that returns a single scalar value?

我正在使用LINQ-to-SQL來查詢舊數據庫的應用程序。 我需要調用一個存儲過程,它選擇一個整數值。 無法更改存儲過程。

設計者使用此簽名創建方法:

private ISingleResult<sp_xal_seqnoResult> NextRowNumber([Parameter(DbType="Int")] System.Nullable<int> increment, [Parameter(DbType="Char(3)")] string dataset)

我希望返回類型為int。 如何使用LINQ-to-SQL執行此操作?

對於標量函數(UDF)而不是SP,這將是微不足道的。 但是,它應該足夠容易 - 雖然如果SP很復雜(即FMT_ONLY無法100%檢查它),那么你可能需要“幫助”它......

這是我從一個返回整數的simplfied SP生成的一些dbml; 你可以通過“open with ... xml editor”編輯dbml:

<Function Name="dbo.foo" Method="foo">
    <Parameter Name="inc" Type="System.Int32" DbType="Int" />
    <Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
    <Return Type="System.Int32" />
</Function>

(注意你顯然需要調整名稱和數據類型)。

這是生成的C#:

[Function(Name="dbo.foo")]
public int foo([Parameter(DbType="Int")] System.Nullable<int> inc, [Parameter(DbType="VarChar(20)")] string dataset)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
    return ((int)(result.ReturnValue));
}

如果您當前的SP使用SELECT(而不是RETURN),那么DBML將需要反映這一點。 您可以通過隱藏實現細節並在分部類中提供公共包裝來解決此問題; 例如:

<Function Name="dbo.foo" Method="FooPrivate" AccessModifier="Private">
    <Parameter Name="inc" Type="System.Int32" DbType="Int" />
    <Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
    <ElementType Name="fooResult" AccessModifier="Internal">
      <Column Name="value" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
    </ElementType>
</Function>

以上描述了一個返回單個表的SP的SP; 但我已經使SP“私有”到數據上下文,結果類型“內部”到程序集(隱藏它):

[Function(Name="dbo.foo")]
private ISingleResult<fooResult> FooPrivate(
    [Parameter(DbType="Int")] System.Nullable<int> inc,
    [Parameter(DbType="VarChar(20)")] string dataset)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
    return ((ISingleResult<fooResult>)(result.ReturnValue));
}

現在在我自己的類文件中,我可以在正確的命名空間中添加一個新的部分類(一個新的.cs文件),這樣可以更方便地公開該方法:

namespace MyNamespace {
    partial class MyDataContext
    {
        public int Foo(int? inc, string dataSet)
        {
            return FooPrivate(inc, dataSet).Single().value;
        }
    }
}

(命名空間和上下文名稱需要與實際數據上下文相同)。 這會添加一個公共方法,隱藏來自調用者的臟話細節。

不要直接編輯designer.cs文件; 你的改變將會丟失。 僅編輯dbml或partial類。

將@VALUE作為proc的最后一個語句返回。

然后它將自動檢測int,string,bool等類型,並相應地生成包裝器方法。

如果您在Linq to SQL類項目中使用Visual Studio的.xsd文件,請確保:

  1. 右鍵單擊適配器中的存儲過程或函數調用。
  2. 選擇屬性
  3. 將執行模式更改為標量

這將使您的適配器函數返回類型為“對象”。 然后,您需要將其強制轉換為int或string,或者它應該是什么類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM