[英]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文件,請確保:
這將使您的適配器函數返回類型為“對象”。 然后,您需要將其強制轉換為int或string,或者它應該是什么類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.