首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 存儲程序基礎映射完整指南

     編輯:關於.NET

LINQ to SQL 提供直觀的設計器支援,可將資料庫存儲程序一鍵映射為 DataContext 的強型別方法。本文以 Northwind 資料庫為例,循序漸進示範無參數、帶參數、OUTPUT 參數三類存儲程序的映射與呼叫全流程。

準備工作:建立 DBML 並拖曳存儲程序

  1. 專案右鍵 → Add → New Item → LINQ to SQL Classes,命名 Northwind.dbml。
  2. 開啟 Server Explorer,連接 Northwind 資料庫,展開 Stored Procedures。
  3. 將目標存儲程序 **拖曳至 DBML 設計介面右側空白區域 (方法窗格)**。
  4. 若拖曳至實體類別 (如 Customer) 上方,設計器會嘗試直接映射為該實體集合;拖曳至空白處則產生自動命名的結果類別 (如 linqDemo1Result)。

案例一:無參數存儲程序

T-SQL 定義

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 資料表欄位一一對應。

自動產生方法 (拖曳至 Customer 實體上)

[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);

案例二:帶輸入參數存儲程序

T-SQL 定義

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");

案例三:帶 OUTPUT 參數存儲程序

T-SQL 定義

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 下拉選單可選擇現有實體類別,避免產生多餘結果類別。
  • 刪除不需要的結果類別:若已映射至實體,可在 DBML 設計介面左側刪除自動產生的 linqDemoXResult 類別。

總結

LINQ to SQL 存儲程序映射核心在於:

  1. DBML 設計器拖曳自動產生 FunctionAttribute 標註方法
  2. 輸入參數 → 方法參數;OUTPUT 參數 → ref Nullable<T>
  3. 回傳結果 → ISingleResult<T> (單結果集) 或 IMultipleResults (多結果集)
  4. 呼叫端如同呼叫普通 C# 方法,享受完整 IntelliSense 與編譯時期型別檢查

掌握這三類基礎映射模式,即可覆蓋 90% 以上實務存儲程序整合場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved