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

微型 ORM:用 VB 與 C# 撰寫的動態型別 ORM,僅 160 行

     編輯:關於ASP.NET

動態型別解決傳統 ORM 的「固執」問題

傳統 ORM 框架要求開發者遵循嚴格的對應規則(如存儲過程必須回傳固定欄位),一旦實際資料庫邏輯複雜(如依參數動態決定回傳欄位、或依內部旗標回傳不同結構),ORM 便難以應對,開發者往往退而求其次使用 DataTable。.NET 4.0 引入的 dynamic 關鍵字提供了新思路:若存儲過程名稱、參數、回傳物件結構皆在執行期決定,將極大提升彈性。

VB.NET 範例

Using con As New SqlClient.SqlConnection(connectionString)
    Dim customer = con.CallSingleProc.CustomerSelect(AccountKey:=12345)
    Console.WriteLine(customer.FirstName & " " & customer.LastName)

    Dim orders As IList = con.CallListProc.OrderSearch(AccountKey:=12345, MinCreatedDate:=Now.AddDays(-7), MaxCreatedDate:=Now)
    Dim totalValue = Aggregate order In orders Into Sum(CDec(order.TotalOrderValue))
    Console.WriteLine("This customer ordered a total of $" & totalValue & " last week")
    For Each order In orders
        Console.WriteLine(vbTab & "Order Key: " & order.OrderKey & " Value: $" & order.TotalOrderValue)
    Next
End Using

C# 範例

using (var con = new SqlConnection(connectionString))
{
    var customer = con.CallSingleProc().CustomerSelect(AccountKey: 12345);
    Console.WriteLine(customer.FirstName + " " + customer.LastName);

    IList<dynamic> orders = con.CallListProc().OrderSearch(AccountKey: 12345, MinCreatedDate: DateTime.Now.AddDays(-7), MaxCreatedDate: DateTime.Now);
    var totalValue = orders.Sum(order => (decimal)order.TotalOrderValue);

    Console.WriteLine("This customer ordered a total of $" + totalValue + " last week");
    foreach (var order in orders)
    {
        Console.WriteLine("\tOrder Key: " + order.OrderKey + " Value: $" + order.TotalOrderValue);
    }
}

核心優勢

  • 零實體類別: 不需預先定義 POCO,屬性由執行期結果動態產生。
  • 存儲過程導向: 直接以方法鏈呼叫存儲過程,參數具名、型別安全。
  • 極簡程式碼: 核心實作僅 160 行,易於理解、擴展與嵌入專案。
  • 跨語言支援: VB 需開啟 Option Strict,C# 大量運用 dynamic,兩者語法風格自然。

這個微型 ORM 專為「不符合標準 ORM 假設」的既有資料庫而生,讓開發者在保有強型別語法便利的同時,享受動態結構的自由度。

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