首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

LINQ與面向對象協作:ORM橋樑下的多態實踐

     編輯:程式設計綜合問答

誤區拆解

「LINQ查詢變成過程化,無法體現多態」源於對對象-關係映射(ORM)角色的誤解。

ORM:面向對象與關係數據的橋樑

// 領域模型(純面向對象)
public abstract class Payment {
    public abstract void Process();
}

public class CreditCardPayment : Payment {
    public string CardNumber { get; set; }
    public override void Process() { /* 信用卡扣款邏輯 */ }
}

public class AlipayPayment : Payment {
    public string OpenId { get; set; }
    public override void Process() { /* 支付寶扣款邏輯 */ }
}

// EF Core 映射(TPH 表巧層次結構)
public class PaymentEntity {
    public int Id { get; set; }
    public string Discriminator { get; set; } // "CreditCard" / "Alipay"
    public string CardNumber { get; set; }
    public string OpenId { get; set; }
}

// LINQ 查詢保持多態語義
var payments = context.Payments
    .OfType() // 類型過濾
    .Where(p => p.Amount > 1000)
    .ToList();

// 多態調用不受影響
foreach (var p in payments) p.Process();

LINQ增強面向對象表達力

傳統SQLLINQ + 領域模型
手寫SQL拼接,類型不安全強類型查詢,編譯期檢查
結果集手動映射對象自動物化領域對象
業務邏輯分散在SQL/存儲過程業務邏輯封裝在實體方法中
難以表達繼承/多態關係原生支持TPH/TPT/TPC映射策略

實戰模式:規約查詢與領域服務

// 規約模式封裝查詢邏輯
public class OverduePaymentSpec : Specification {
    public override Expression> ToExpression() {
        return p => p.DueDate < DateTime.Today && p.Status == PaymentStatus.Pending;
    }
}

// 領域服務協調
public class PaymentCollectionService {
    public void CollectOverdue() {
        var spec = new OverduePaymentSpec();
        var overdue = repository.Find(spec); // LINQ 在 Repository 內部執行
        foreach (var p in overdue) p.Escalate(); // 多態調用
    }
}

總結

LINQ不削弱面向對象,而是通過ORM將關係數據物化為領域對象,使多態、封裝、繼承等OO特性在持久化場景下得以保留。關鍵在於:領域模型驅動設計,LINQ服務於Repository實現細節,而非洩露到業務邏輯層。

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