本文以Northwind數據庫為例,說說Linq to SQL中是怎樣使用存儲過程。
首先我們創建一個存儲過程:
create procedure dbo.linqDemo1
as
select * from customers
打開dbml設計器,在Server Explorer裡面找個這個存儲過程,把它拖拽到設計器裡面,可以看到這個 存儲過程被映射為方法了
這裡有一點值得注意,(以存儲過程linqDemo1為例)默認情況下,設計器對存儲過程進行分析,將所 有輸出構造成一個結果類,運行該存儲過程返回的就是這個類的對象集合。看看linqDemo1自動生成的代 碼:
[Function(Name="dbo.linqDemo1")]
public ISingleResult<linqDemo1Result> linqDemo1() {
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo) (MethodInfo.GetCurrentMethod())));
return ((ISingleResult<linqDemo1Result>)(result.ReturnValue));
}
LinqDemo1Result類就是生成的結果類,由於返回的customer表,該類的所有屬性其實和customer的一 模一樣。 所以剛才拖拽存儲過程的時候,如果把它拖拽到Customer類圖的上面而不是周圍的空白區域, 生成的代碼如下:
[Function(Name="dbo.linqDemo1")]
public ISingleResult<Customer> linqDemo1() {
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo) (MethodInfo.GetCurrentMethod())));
return ((ISingleResult<Customer>)(result.ReturnValue));
}
可以看到,它將存儲過程返回的結果用Customer對象的集合來表示,而非創建一個自定義的結果類。
那麼怎樣運行存儲過程呢?就和調用普通的成員方法一樣,Linq to SQL將它映射到數據庫中的存儲過 程:
NorthwindDataContext ctx = new NorthwindDataContext();
var results = ctx.linqDemo1();
是不是很簡單?下面再來看看怎樣調用帶參數的存儲過程
create procedure dbo.linqDemo2
@cID varchar(5)
as
select * from customers where customerID = @cID
然後利用設計器自動映射該存儲過程,帶參數的存儲過程也就相應的映射為帶參數的成員函數,怎樣 調用就不多說了。
[Function(Name="dbo.linqDemo2")]
public ISingleResult<Customer> linqDemo2([Parameter(DbType="VarChar(5)")] string cID) {
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo) (MethodInfo.GetCurrentMethod())), cID);
return ((ISingleResult<Customer>)(result.ReturnValue));
}
如果我們使用帶output參數的存儲過程呢?
create procedure dbo.linqDemo3
@cID varchar(5),
@msgCode int output
as
select * from customers where customerID = @cID
set @msgCode = 50
生成的成員函數是下面這樣:
[Function(Name="dbo.linqDemo3")]
public ISingleResult<Customer> linqDemo3([Parameter(DbType="VarChar(5)")] string cID,
[Parameter(DbType="Int")] ref System.Nullable<int> msgCode) {
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), cID, msgCode);
msgCode = ((System.Nullable<int>)(result.GetParameterValue(1)));
return ((ISingleResult<Customer>)(result.ReturnValue));
}
可以看到它使用一個ref參數來保存返回參數的值,如下調用:
NorthwindDataContext ctx = new NorthwindDataContext();
int? output = 0;
var results = ctx.linqDemo3("ALFKI", ref output);