LINQ to SQL 提供直觀的設計器支援,可將資料庫存儲程序一鍵映射為 DataContext 的強型別方法。本文以 Northwind 資料庫為例,循序漸進示範無參數、帶參數、OUTPUT 參數三類存儲程序的映射與呼叫全流程。
Northwind.dbml。Customer) 上方,設計器會嘗試直接映射為該實體集合;拖曳至空白處則產生自動命名的結果類別 (如 linqDemo1Result)。CREATE PROCEDURE dbo.linqDemo1
AS
BEGIN
SELECT * FROM Customers;
END
[Function(Name="dbo.linqDemo1")]
public ISingleResult<linqDemo1Result> linqDemo1()
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((ISingleResult<linqDemo1Result>)(result.ReturnValue));
}
linqDemo1Result 類別屬性與 Customers 資料表欄位一一對應。
[Function(Name="dbo.linqDemo1")]
public ISingleResult<Customer> linqDemo1()
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())));
return ((ISingleResult<Customer>)(result.ReturnValue));
}
直接回傳 ISingleResult<Customer>,省去手動轉換步驟,**強烈建議拖曳至對應實體上**。
var ctx = new NorthwindDataContext();
var results = ctx.linqDemo1(); // 返回 IEnumerable<Customer> 可直接 foreach
foreach (var c in results) Console.WriteLine(c.ContactName);
CREATE PROCEDURE dbo.linqDemo2
@cID VARCHAR(5)
AS
BEGIN
SELECT * FROM Customers WHERE CustomerID = @cID;
END
[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));
}
var results = ctx.linqDemo2("ALFKI");
CREATE PROCEDURE dbo.linqDemo3
@cID VARCHAR(5),
@msgCode INT OUTPUT
AS
BEGIN
SELECT * FROM Customers WHERE CustomerID = @cID;
SET @msgCode = 50;
END
[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));
}
關鍵點:OUTPUT 參數映射為ref Nullable<T>,呼叫後透過result.GetParameterValue(index)取得輸出值,索引從 0 起算對應參數順序。
int? output = 0;
var results = ctx.linqDemo3("ALFKI", ref output);
Console.WriteLine($"OUTPUT 參數值: {output}"); // 輸出 50
Name 屬性 (如 GetCustomers),生成代碼同步更新。Return Type 下拉選單可選擇現有實體類別,避免產生多餘結果類別。linqDemoXResult 類別。LINQ to SQL 存儲程序映射核心在於:
FunctionAttribute 標註方法ref Nullable<T>ISingleResult<T> (單結果集) 或 IMultipleResults (多結果集)掌握這三類基礎映射模式,即可覆蓋 90% 以上實務存儲程序整合場景。